爬虫笔记

一、课程简介

(一)课程开发环境

1、环境:爬虫主要语言是python语言。

要求python的环境会搭建。

anaconda:python集成包管理工具。

2、开发工具是pycharm,vscode。

(二)网络爬虫的应用

1、爬想要的数据。

2、毕业论文课题。

扎实的python基础。

3、软件数据来源。

4、学习和实践python很好的工具。

(三)课程学习方法

1、爬虫是模拟客户端爬去数据。-----分析网页的方法很重要。

建议:

上课中重点关注我如何分析网站。

练习时必须要自己操作一遍。

2、积累代码量。

python代码非常灵活。

第一讲 爬虫基础

一、数据的获取途径

1)企业产生的用户数据:

百度指数:http://index.baidu.com/

阿里指数:http://alizs.taobao.com/

2)数据平台购买数据:

数据堂:https://www.datatang.com/

国云数据市场:http://www.moojnn.com/data-market/

贵阳大数据交易所:http://trade.gbdex.com/trade.web/index.jsp

3)政府/机构公开的数据:

中华人民共和国国家统计局数据:http://data.stats.gov.cn/index.html

世界银行公开数据:http://data.worldbank.org.cn/

联合国数据:http://data.un.org/

纳斯达克:http://www.nasdaq.com/zh

4)数据管理咨询公司:

麦肯锡:http://www.mckinsey.com.cn/

埃森哲:http://www.accenture.com/cn-zh/

艾瑞咨询:http://www.iresearch.com.cn/

5)爬取网络数据:

如果需要的数据市场上没有,或者不愿意购买,那么可以选择招做一名爬虫工程师,

二、爬虫简介

1、定义

网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

2、分类

(1)通用爬虫:

通用网络爬虫是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。

搜索引擎是基于关键字搜索。

(2)聚焦爬虫

聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。

三、requests模块

为什么说python很强大?

  • 模块比较多。
  • 扩展性强,可以和c,java等其他高级语言混合开发。
    cpython--底层就是用c开发的。
    很难去查看源码,因为你要会c。
    go语言:天生支持并发。
    1、数据结构。
    2、操作系统原理--操作系统的任务。
    3、编译原理--高级语言的基础。

(一)requests模块简介

Urllib和Requests模块是发起http请求最常见的模块。requests模块是第三方模块。

虽然Python的标准库中urllib 模块已经包含了平常我们使用的大多数功能,但是它的 API使用起来让人感觉不太好,而Requests自称“http for Humans”,说明使用更简洁方便。

开源地址:http://github.com/kennethreitz/requests

中文文档API:http://2.python-requests.org/zh_CN/latest/

$ pip install requests

如果使用anaconda,requests就是有的。

1、pycharm介绍

(1)修改主题

(2)修改字体

ctrl+滚轮修改字体大小。

(3)修改注释颜色

2、如何使用pycharm创建项目

第一步:创建一个文件夹

第二步:将文件夹拖到pycharm图标处

第三步:配置解释器

(二)request模块的使用

1、网络请求

请求

客户端请求。有四个部分组成:请求行,请求头,空行,请求数据。

(1)请求行:http协议版本,请求方法

(2)请求头:用来标识请求信息的部分。

(3)请求数据:post方法存放参数位置。

请求方法:常见的请求方法有get和post两种。

(1)get请求方法:get(获取),向服务器获取资源的方法。

带参数的get请求,参数的作用告诉服务器获取那些特定的资源。

带参数有的url格式:http://www.baidu.com?参数1=参数值&参数2=参数值

https://www.baidu.com?username=zhangsan&password=123

get请求的缺点:参数放在url中不安全。大小受限。

(2)post请求:post(提交)向服务器提交资源的方法。提交的时候有一个参数就做表单数据。

响应

响应又称为服务器响应。响应由四个部分组成:状态行,状态头,空行,响应正文

(1)状态行:协议版本,状态码

状态码:用来标识服务器响应操作

304:使用缓存。200成功

(2)响应正文:服务器返回的数据。

在chrome浏览器查看响应位置:

2、requests发送get请求

语法:

#1、导包
import requests
#2、发送请求,获取响应
rsponse  = requests.get(
	url='请求url',
	headers = {请求头字典},
	params = {请求参数字典},
)

函数设计比较好:

def sum(a,b):

def sum(a,b,c):

案例一:百度产品页下载

知识点:

  • requests模块使用步骤
  • requests发送get请求方法
  • response对象的属性
  • 乱码问题的解决。

url:https://www.baidu.com/more/

#1导包
import requests
#2确定url
base_url = 'https://www.baidu.com/more/'
#3发送请求,获取响应
respones = requests.get(url=base_url)
print(respones)#<Response [200]>--response对象,200状态码
#response对象属性
# (1)获取状态吗
print(respones.status_code)
# (2)响应头
print(respones.headers)
# (3)响应正文--重点
#文本信息的两种格式。二进制和字符串
# 响应正文的字符串格式:response.text
# print(respones.text)
#响应正文的二进制格式:response.content
# print(respones.content)
#(4)解决乱码
#乱码问题的出现原因:字符串和二进制转化是需使用的编码有误。
#常见的中文码表:utf-8,gbk,
#编码在python中指定都是通过encoding参数来完成。
#解决乱码的问题:可以获取二进制,使用正确的编码手动转换成字符串即可。



html_str = respones.content.decode(encoding='utf-8')
print(html_str)
#保存
#mode:
#w:写,如果文件不存在会创建
#r:读
#wb:写入二进制
#rb:读二进制
#a:追加
with open('index.html',mode='w',encoding='utf-8') as fp:
    fp.write(html_str)

案例二:新浪新闻下载

网址:https://news.sina.com.cn/

需求:给定一个新闻关键字,下载对应新闻网页到本地。

知识点:get带参数网页请求方法。

import requests

def get_sina_news1(key):
    '''
    下载新浪新闻的网页
    方法1:使用字符串格式化操作来填充对应的get参数。
    修改的参数少时,建议使用它
    :param key: 新闻的关键
    :return:
    '''
    # 1确定url
    base_url = 'https://search.sina.com.cn/?q=%s&c=news&sort=time' %key
    #2发送请求,获取相应
    response = requests.get(url = base_url)
    # print(response.text)
    with open(f'{key}.html','w',encoding='utf-8') as fp:
        fp.write(response.text)


def get_sina_news2(key):
    '''
    方法2:使用params参数。
    :param key:
    :return:
    '''
    #1确定url
    base_url = 'https://search.sina.com.cn/?'
    params = {
        'q': key,
        'c': 'news',
        'sort': 'time'
    }
    #2发送请求,获取相应
    response = requests.get(url = base_url,params =params )
    with open(f'{key}.html','w',encoding='utf-8') as fp:
        fp.write(response.text)

key = input('请输入你要下载新闻:')
# get_sina_news1(key)
get_sina_news2(key)

3、requests模块发送post请求

语法:

response = requests.post(
	url = '请求的url',
	headers = {请求头},
	data = {提交的数据表单},
)

案例三:百度翻译案例

url:https://fanyi.baidu.com/

import requests

#1确定url
base_url = 'https://fanyi.baidu.com/sug'
# 2准备提交的参数
word = input('请输入你要翻译的单词:')
data = {
    'kw': word,
}
#3发送请求,获取相应
response = requests.post(url = base_url,data = data)
# print(response.text)
#在json结构的数据中。中文格式: \u5355\u8bcd
#响应中获取json结构的数据:response.json()
jaon_data = response.json()
# print(jaon_data)
# print(type(jaon_data))#<class 'dict'>
result = ''
for data in jaon_data['data']:
    # print(data)
    result+=data['v']+'\n'
print(result)

4、请求头的作用

案例4:爬取百度案例

url:https://www.baidu.com/

import requests

#1确定url
base_url = 'https://www.baidu.com/'
#封装请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',

}
#2发送请求获取响应
response= requests.get(base_url,headers = headers)
print(response.text)
#问题:发现响应正文中数据表少了,或者数据出错。---说明了发送的这条请求除了问题。
#解决办法:请求头:标识请求信息。
#封装请求头就可以解决这种问题

5、requests模块实现登录

为什么要学习登录?

原因:爬取的目标网站规定必须登录后才能查看数据,这时我们爬虫也会实现登录才能正确爬出数据。

在请求头中:cookie头的作用就是用来记录用户的登录信息。所以实现登录的方法非常简单,只需要将登录后的cookie从浏览器复制到headers头用于请求即可。

posted @ 2021-04-01 15:07  学途_w  阅读(110)  评论(0)    收藏  举报