爬虫笔记
一、课程简介
(一)课程开发环境
1、环境:爬虫主要语言是python语言。
要求python的环境会搭建。
anaconda:python集成包管理工具。
2、开发工具是pycharm,vscode。
(二)网络爬虫的应用
1、爬想要的数据。
2、毕业论文课题。
扎实的python基础。
3、软件数据来源。
4、学习和实践python很好的工具。
(三)课程学习方法
1、爬虫是模拟客户端爬去数据。-----分析网页的方法很重要。
- chrome的操作。
下载地址:https://www.google.cn/chrome/ - 分析网站的方法。
建议:
上课中重点关注我如何分析网站。
练习时必须要自己操作一遍。
2、积累代码量。
python代码非常灵活。
第一讲 爬虫基础
一、数据的获取途径
1)企业产生的用户数据:
2)数据平台购买数据:
国云数据市场: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/
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)
案例二:新浪新闻下载
需求:给定一个新闻关键字,下载对应新闻网页到本地。
知识点: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 = {提交的数据表单},
)
案例三:百度翻译案例
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:爬取百度案例
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头用于请求即可。