爬虫通过编写程序来获取互联网上的资源
web请求过程解析
1.服务器渲染:在服务器那边直接把数据和HTML整合在一起,统一返回给浏览器
特点:在页面源代码中能看到数据
2.客户端渲染:第一次请求只要一个HTMl骨架,第二次请求拿到数据,进行数据展示. 特点:在页面源代码中看不到数据(数据在第二次请求中)
所以在看不到数据的时候不要慌,再往下找找
HTTP协议
协议:就是两个计算机之间为了能够流畅的进行沟通而设置的一个君子协议.常见的协议有TCP/IP,SOAP协议,HTTP协议,SMTP协议等等
HTTP协议:超文本传输协议,浏览器与服务器之间的数据交互遵守的就是HTTP协议.
HTTP协议把一条消息分为三大块内容(无论请求还是响应)
请求:
1.请求行->请求方式(get/post) 请求url协议 协议
2.请求头->放一些服务器要使用的**附加信息**
3.
4.请求体->一般放一些请求参数
响应:
1.状态行->协议 状态码
2.响应头->放一些客户端要使用的一些附加信息
3.
4.响应体->服务器返回的真正客户端要用的内容(HTML,json)等
请求头中最常见的一些重要内容
1.User-Agent:请求载体的身份标识(用啥发送的请求)
2.Referer:防盗链(这次请求从那个页面来,反爬虫会用到)
3.cookie:本地字符串数据信息(用户登陆信息,反爬的token)
响应头中最常见的一些重要内容
1.cookie:本地字符串数据信息(用户登陆信息,反爬的token)
2.各种神奇的莫名奇妙的字符串(这个就需要经验了,一般都是token字样,防止各种攻击和反爬)
requests入门
实例代码
- 搜狗浏览器查询
import requests
url='https://www.sogou.com/web?query=%E9%87%91%E6%99%A8%E8%84%96%E5%AD%90%E6%9C%8914'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
}
res=requests.get(url=url,headers=headers).text
print(res)
2.百度翻译
#百度翻译url
'https://fanyi.baidu.com/?aldtype=16047#auto/zh'
#但他是有两个请求的那种客户端渲染,所以实际上有数据的不是他
import requests
url='https://fanyi.baidu.com/sug'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
}
chaxun=input('请输入你要查询的内容')
data={
'kw':chaxun
}
#res=requests.post(url=url,headers=headers,data=data).text
#print(res) 这里有个问题看输出结果
请输入你要查询的内容dog
{
"errno":0,"data":[{
"k":"dog","v":"n. \u72d7; \u8e69\u811a\u8d27; \u4e11\u5973\u4eba; \u5351\u9119\u5c0f\.....
是个乱码
更改
res=requests.post(url=url,headers=headers,data=data).json()
print(res) 直接让他变成json数据(再python中就是字典)
{
'errno': 0, 'data': [{
'k': 'dog', 'v': 'n. 狗; 蹩脚货; 丑女人; 卑鄙小人 v. 困扰; 跟踪'}, {
'k': 'DOG', 'v': 'abbr. Data Output Gate 数据输出门'}, {
'k': 'doge', 'v': 'n. 共和国总督'}, {
'k': 'dogm', 'v': 'abbr. dogmatic 教条的; 独断的; dogmatism 教条主义; dogmatist'}, {
'k': 'Dogo', 'v': '[地名] [马里、尼日尔、乍得] 多戈; [地名] [韩国] 道高'}]}
3.豆瓣电影分类排行榜
注意二次请求的数据可以通过XHR进行筛选
#豆瓣喜剧排行榜url
"https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action="
#这个玩意是第一次发起请求对应的url,但无法获取数据
import requests
start=str((int(input('请输入你要查找的页数')))*10)
url='https://movie.douban.com/j/chart/top_list?type={
}&interval_id={
}\
&action=&start={
}&limit={
}'.format('24','100:90',start,'20')
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
}
res=requests.get(url=url,headers=headers)
print(res.json())
也可以这样写
import requests
param={
'type': '24',
'interval_id': '100:90',
'action': '',
'start': '0',
'limit': '20'
}
url='https://movie.douban.com/j/chart/top_list'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
}
res=requests.get(url=url,headers=headers,params=param)
print(res.json())
res.close()
后面记得把浏览器窗口关闭
数据解析概述
1.re解析
2.bs4解析
3.xpath解析
这三种解析方法可以混合使用
re解析
正则表达式,一种使用表达式的方式对字符串进行匹配的语法规则
优点:速度快,效率高,准确性高
缺点:新手上手难度高
关于他的相关方法直接在网上就能搜到
常用正则表达式
re.S的作用是让.可以匹配换行符防止断开
4.手刃豆瓣TOP250电影排行榜
里面还包含了一些xlwt模块的使用方法,以后忘记了可以看一下
大概的思路就是这个样子
import requests
import re
import xlwt
#1.爬取网页源代码
url='https://movie.douban.com/top250'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
}
res=requests.get(url=url,headers=headers)
html=res.text
print(html)
#2.使用re进行解析
findname=re.compile(r' <img width="100" alt="(.*?)" src=.*?')
findneirong=re.compile(r'<p class="">(.*?)</p>',re.S)
findpjrs=re.compile(r'<div class="star">.*?<span>(.*?)</span>',re.S)
findpjfs=re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>')
findpy=re.compile(r'<span class="inq">(.*?)</span>')
name=findname.findall(html)
neirong=findneirong.findall(html)
pjrs=findpjrs.findall(html)
pjfs=findpjfs.findall(html)
py=findpy.findall(html)
neirong1=[]
for i in range(len(neirong)):
a=neirong[i].replace(' ','')
b=a.replace('<br>','')
c=b.replace(' ','')
neirong1.append(c)
#3.开始向excel中写入数据
workbook = xlwt.Workbook(encoding='utf-8')
sheet=workbook.add_sheet('豆瓣TOP250',cell_overwrite_ok=True)
#注意从0 0开始
tup=('电影名称','相关人员','评分','评价人数','评语')
for i in range(len(tup)):
sheet.write(0,i,tup[i])
lis=[name,neirong1,pjfs,pjrs,py]
#开始导入数据
for i in range(20):
for j in range(5):
print(lis[j][i],end=',')
sheet.write(i,j,lis[j][i])
print()
workbook.save('E:\\2021年最新Python爬虫教程+实战项目案例(最新录制)\\爬虫文件保存\\1.豆瓣TOP250.xls')
res.close()
5.屠戮盗版天堂电影信息
这里涉及了页面的跳转,在html中a标签储存的是超链接
在这里面title是我鼠标停留时会出现的内容 href对应的时url(超链接)
这个占时看不懂也没关系,就是涉及了一个页面的跳转问题
#爬取电影天堂
#这个属于那种服务器渲染的网页
#网页源代码中有我想要的一切
#那么现在就开始了
import re
import requests
#1.获取初始网页源代码
url='https://www.dy2018.com/'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
}
res=requests.get(url,headers)
res.encoding='gb2312'
html=res.text
#2.得到想要的链接
findhrefs=re.compile(r'2021必看热片.*?<ul>(.*?)</ul>',re.S)
findhref=re.compile(r"<li><a href='(?P<href>.*?)' title=",re.S)
finddown=re.compile(r'<td style="WORD-WRAP: break-word" bgcolor="#fdfddf"><a href="(.*?)">magnet',re.S)
hrefs=findhrefs.findall(