爬虫简介
爬虫在使用场景中的分类
- 通用爬虫
- 抓取系统重要组成部分
- 抓取的是一整张页面数据
- 聚焦爬虫
- 聚焦在通用爬虫的基础之上
- 抓取的是页面中特定的局部内容
- 增量式爬虫
在法律中不被禁止
具有违法风险
通过编写程序 模拟浏览器上网 然后让其取互联网抓取数据的过程
- robots.txt协议
requests模块
- 明确规定了那些数据可以被爬虫爬取,哪些不可以被爬取 君子协议
- python中原生的一款基于网络请求的模块 功能非常强大 简单快捷 效率极高
- 作用:模拟浏览器发请求
- 如何使用
- 数据解析分类
- 正则
- bs4
- 1.实例化一个beautifulsoup对象,并且将页面源码数据加载到该对象中
- 2.通过调用beautifulsoup对象中相关的属性或者方法进行标签定位和数据取
- xpath
- 最常用最便捷最高效的一种解析方式 通用性也强
- 解析原理
- 1.实例化一个etree的对象 且需要将被解析的页面源码数据加载到改数据当中
- 2.调用etree对象中的xpath方法结合xpath表达式实现标签的定位和内容的捕获
- 环境安装:-pip install lxml
- 如何实例化一个etree对象
- 1.将本地的html文档对象中的源码数据加载到etree对象中
etree.parse(filepath)
- 2.可以将从互联网上获取的源码数据加载到改对象中
etree.HTML('page_text')
- 1.将本地的html文档对象中的源码数据加载到etree对象中
- xpath(‘xpath表达式’)
- /:表示的是从根节点开始,表示的是一个层级
- //:表示的是多个层级。可以从任意位置开始定位
- 属性定位://tag[@class=‘class名’]
- 索引定位://tag[@class=‘class名’]/tag2[x] 索引是从1开始的
- 取文本:/text()[0](因为返回的是一个列表 所以加上[0])
- 取属性:/@属性值
- 解析原理
- 最常用最便捷最高效的一种解析方式 通用性也强
- 数据解析原理
- 解析的局部的文本内容都会在标签之间或标签对应的属性中进行存储
- 1.进行标签定位
- 2.标签或者标签对应的属性中存储的数据值进行提取(解析)
- 编码流程
- 1.指定url
- 2.发起请求
- 3.获取响应数据
- 4.数据解析
- 5.持久化存储
验证码
- 验证码识别
- 反爬机制:验证码 识别验证码图片中的数据,用于模拟登录操作
- 识别验证码
- 1.人工肉眼识别
- 2.第三方自动识别
云打码 超级鹰
request高级
- 代理
破解封ip这种反爬机制
- 什么是代理
代理服务器
- 代理的作用
突破自身ip的限制 隐藏自身真实ip
- 代理相关网站
块代理 西祠代理 西祠代理 www。goubanjia。com
- 代理ip类型
http https
- 什么是代理
异步爬虫
-之后的内容正在学习中
简单爬虫实例
- 以下几个例子是通过学习爬虫并通过python写出的简单练习,均为新手练习 在此记录一下:
肯德基餐厅信息查询
- 可以通过输入要检索的城市名称来进行指定信息扒取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23import requests
url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
city=input("请输入要爬取的城市名称")
index=input("q请输入要爬取的页码")
keyword={
'cname':'' ,
'pid':'' ,
'keyword': city,
'pageIndex':index,
'pageSize':'10',
}
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
response=requests.post(url=url,data=keyword,headers=headers)
response_text=response.text
print(response_text)
filename=city+'肯德基餐厅信息.text'
fp=open(filename,'a',encoding='utf-8')
fp.write('\n')
fp.write(response_text)
print("爬取成功")搜狗浏览器搜索页面的扒取
- 扒取到的是一整张搜索页面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16import requests
url='https://www.sogou.com/web'
kw=input("请输入要爬取的内容:")
uag={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
quar={
'query':kw
}
respon=requests.get(url=url,params=quar,headers=uag)
filename=kw+'.html'
respon_text=respon.text
with open(filename,'w',encoding='utf-8') as fp:
fp.write(respon_text)
print(filename ,"保存成功")豆瓣电影排行榜数据扒取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19import requests
import json
url='https://movie.douban.com/j/chart/top_list'
list={
'type': '24',
'interval_id':'100:90',
'action':'',
'start': '0',
'limit': '200',
}
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
response=requests.get(url=url,params=list,headers=headers)
name_list=response.json()
fp=open('豆瓣电影排行榜.json','w',encoding='utf-8')
json.dump(name_list,fp=fp,ensure_ascii=False)
print("爬取完成")百度搜索结果扒取
- 可以自主输入要扒取的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24import requests
import json
#获取url
post_url='https://fanyi.baidu.com/sug'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
search=input("请输入你要搜索的对象:")
name={
'kw':search
}
sponse=requests.post(url=post_url,data=name,headers=headers)
dictobj=sponse.json()
print(dictobj)
filename='搜索结果.json'
fp=open(filename,"a",encoding='utf-8')
fp.write('\n')
json.dump(dictobj,fp=fp,ensure_ascii=False)
print("搜索完毕,结果已输出")对糗事图片网站图片的批量扒取
- 纯粹的批量扒取图片下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23import requests
import re
import os
if not os.path.exists('./img_list'):
os.mkdir('./img_list')
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
for j in range(1,3):
url='http://xiaohua.zol.com.cn/qutu/diaosi/%d.html'
new_url=format(url%j)
respons=requests.get(url=new_url,headers=headers).text
ex='<div class="summary-text">.*?<img ?l?o?a?dsrc="(.*?)" alt.*?</div>'
img_list=re.findall(ex,respons,re.S)
print(img_list)
for src in img_list:
imgdata= requests.get(url=src,headers=headers).content
img_name=src.split('/')[-1]
img_path= './img_list/'+img_name
fp=open(img_path,'wb')
fp.write(imgdata)国家药品监督管理总局中居于中华人民共和国化妆品生产许可证相关数据
- 纯粹练习之作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36import requests
import json
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
url ='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
for l in range(1,6):
page=str(l)
data={
'on': 'true',
'page': page,
'pageSize': '15',
'productName': '',
'conditionType': '1',
'applyname':'' ,
'applysn': '',
}
list_id=[]
response=requests.post(url=url,data=data,headers=headers).json()
print(response)
for i in response['list']:
list_id.append(i['ID'])
print(list_id)
name_url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
for j in list_id:
data2={
'id':j
}
fp=open("药监局数据.json",'a')
fp.write('\n')
response2=requests.post(url=name_url,data=data2,headers=headers).json()
json.dump(response2,fp=fp,ensure_ascii=False)
print("爬取完毕")三个图片网站的批量下载
- 大同小异的图片扒取练习
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29import requests
from lxml import etree
import os
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
url='http://pic.netbian.com/4kmeinv/'
# 获取响应
response=requests.get(url=url,headers=headers).text
# print(response)
# 数据解析
tree=etree.HTML(response)
li_list=tree.xpath('//div[@class="slist"]/ul/li')
print(li_list)
# 创建一个文件夹
if not os.path.exists('./picture'):
os.mkdir('./picture')
# 遍历 再解析
for i in li_list:
img_src='http://pic.netbian.com'+i.xpath('./a/img/@src')[0]
img_name=i.xpath('./a/img/@alt')[0]+'.jpg'
# 通用请求中文乱码解决方案
img_name=img_name.encode('iso-8859-1').decode('gbk')
#存储文件
img_data=requests.get(url=img_src,headers=headers).content
img_path='picture/'+img_name
with open(img_path,'wb') as fp:
fp.write(img_data)
print(img_name,'下载成功')2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32import os
import requests
from lxml import etree
if not os.path.exists('./图片3'):
os.mkdir('./图片3')
url='https://sc.chinaz.com/tupian/xingganmeinvtupian.html'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
response=requests.get(url=url,headers=headers).text
tree=etree.HTML(response)
img_src=tree.xpath('//*[@id="container"]/div/div/a/@href')
img_list=[
]
for j in img_src:
img_src2='https:'+j
img_list.append(img_src2)
print(img_list)
for inn in img_list:
response2=requests.get(url=inn,headers=headers).text
tree2=etree.HTML(response2)
img_u=tree2.xpath('//div[@class="downbody"]/div[3]/a[1]/@href')[0]
print(img_u)
response3=requests.get(url=img_u,headers=headers).content
img_name=inn.split('/')[-1]+'.rar'
img_path='./图片3/'+img_name
with open(img_path,'wb') as fp:
fp.write(response3)
print("下载完成")3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27import os
from lxml import etree
import requests
if not os.path.exists('./图片4'):
os.mkdir('./图片4')
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
url='https://www.game234.com/meizi/index_%d.html'
for k in range(2,10):
new_url=format(url%k)
sponse=requests.get(url=new_url,headers=headers).text
tree=etree.HTML(sponse)
img_p=tree.xpath('//*[@id="sortable"]/div/div/a/@href')
for i in img_p:
img_src='https://www.game234.com'+i
sponse2=requests.get(url=img_src,headers=headers).text
tree2=etree.HTML(sponse2)
img_q=tree2.xpath('//*[@id="article-box"]/div[2]/img/@src')
print(img_q)
for j in img_q:
img_list=j
response3=requests.get(url=j,headers=headers).content
img_name=j.split('/')[-1]
img_path='./图片4/'+img_name
with open(img_path,'wb') as fp:
fp.write(response3)