爬虫就是spider,网络蜘蛛
爬虫流程步骤:
pip3 install requests
import requests #定义请求的url url='https://www.baidu.com/' #发起get请求 res=requests.get(url=url) #获取响应结果 print(res)#<Response [200]>获得一个200的状态码 print(res.content)#太长,省略不用 print(res.text) print(res.content.decode('utf-8')) print(res.status_code)#200 print(res.url)#https://www.baidu.com/ print(res.request.headers)#{'User-Agent': 'python-requests/2.26.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
pypi.org
'user-agent’用chrome去网页的network里面去查userAgent
import requests #定义请求的url url='https://www.lmonkey.com/' #定义请求头信息 headers={ 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36' } #发起get请求 res=requests.get(url=url,headers=headers) #获取响应结果 code=res.status_code print(code)#200 if code==200: with open('./test.html','w',encoding='utf-8') as fp: fp.write(res.text)
结果:
根目录下生成test.html
import requests #定义请求的url 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/92.0.4515.131 Safari/537.36' } #post发送的数据 data={'kw':'你好'} #发送请求 res=requests.post(url=url,headers=headers,data=data) #接受返回数据 code=res.status_code print(code)#200 if code==200: print('请求成功') data=res.json() if data['errno']==0: print('响应成功') print(data['data'][0]['k']) value=data['data'][0]['v'] print(value.split(';').pop()) #print(res.text)#使用文本解析rest结果 print(res.json())#使用json方式解析#{'errno': 0, 'data': [{'k': '你好', 'v': 'hello; hi; How do you do!'}, {'k': '你好吗', 'v': 'How do you do?'}, {'k': '你好,陌生人', 'v': '[电影]Hello Stranger'}]}
结果:
200
请求成功
响应成功
你好
How do you do!
{‘errno’: 0, ‘data’: [{‘k’: ‘你好’, ‘v’: ‘hello; hi; How do you do!’}, {‘k’: ‘你好吗’, ‘v’: ‘How do you do?’}, {‘k’: ‘你好,陌生人’, ‘v’: ‘[电影]Hello Stranger’}]}
地址有有问题,报错,不过看headers里添加cookie代码就好
import requests #定义请求的url url='https://lmonkey.com/' #定义请求头信息 headers={ 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36', 'cookie':'UM_distinctid=17c1fbab167af2-013fbad84c2a8f-4343363-1fa400-17c1fbab168b7b; CNZZDATA1277679765=2066258434-1632613844-|1632613844; documentTitle=学习猿地 - IT培训|Java培训|Python培训|ui设计培训|web前端培训|GO培训|PHP培训|成就自己的只需一套精品; documentIcon=https://ccidcdn.wkjc.cn/Fq0R3EQY3U0DdfsdTj-7owTVWsCZ.png; fromPath=; loginWxConfig=1; registerConfig=1; href=https://www.lmonkey.com/; accessId=ad8e1ca0-2091-11ea-af9d-6523a0f144a7; authToken=oUw2sxLAughXiHJhM6jqFeyB78PrM80KLVjjNjmf7bw; qimo_seosource_ad8e1ca0-2091-11ea-af9d-6523a0f144a7=站内; qimo_seokeywords_ad8e1ca0-2091-11ea-af9d-6523a0f144a7=; qimo_xstKeywords_ad8e1ca0-2091-11ea-af9d-6523a0f144a7=; pageViewNum=3; userToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvYXBpLmxtb25rZXkuY29tXC9hcGlcL3dlY2hhdF9sb2dpbl9jaGVjayIsImlhdCI6MTYzMjYyNDU5MiwiZXhwIjo3NjMyNjI0NTMyLCJuYmYiOjE2MzI2MjQ1OTIsImp0aSI6Ilc1dmd6aUFaZE5QQjJmbmgiLCJzdWIiOjc1MTAxLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.LZ_Muxfgss-aBzbO_CiGp6KQ4EgQ7E-43TQHkW6CA9I' } #发送get请求 res=requests.get(url=url,headers=headers) #接受返回数据 code=res.status_code print(code)#200 if code==200: with open('./test1.html','w',encoding='utf-8') as fp: fp.write(res.text)
requests.session()
pip install lxml
使用xpath模块
from lxml import etree
关于在windows版本pycharm的pip最新版本使用的问题
xpath其实就是解析路径,有点像bom。类似jquery。获取html的节点及操作html节点
from lxml import etree text=''' <!DOCTYPE html> <head> <meta charset="UTF-8"> <title>这是我的标题</title> </head> <body> <div class="grandfather"> <div class="father"> <div class="son"> <ul> <li>这是我的第一条新闻</li> <li>这是我的第二条新闻</li> <li>这是我的第三条新闻</li> </ul> </div> <div class="anotherson"> <ol> <li>还是你的第一条资讯</li> <li>还是你的第二条资讯</li> <li>还是你的第三条资讯</li> </ol> </div> <div class="oneson"> <ul> <li><a href="http://www.baidu.com">我的第一条链接</a></li> <li><a href="http://www.sina.com.cn">我的第二条链接</a></li> <li><a href="http://www.sohu.com">我的第三条链接</a></li> </ul> </div> </div> </div> <ul> <li>每条资讯都是独一无二的</li> <li>这条资讯不会觉得似曾相识</li> <li>条条资讯未必都能通向知识大门</li> </ul> </body> ''' #使用etree解析html字符串 html=etree.HTML(text) #print(html)#<Element html at 0x3198988> #提取数据 res=html.xpath('/html/body/ul/li/text()')#['每条资讯都是独一无二的', '这条资讯不会觉得似曾相识', '条条资讯未必都能通向知识大门'] print(res) #使用了下标,这里下标从1开始 res=html.xpath('/html/body/div/div/div/ul/li[1]/a/text()') print(res)#['我的第一条链接']
from lxml import etree #使用etree解析html文件 html=etree.parse('./myhtml.html',etree.HTMLParser()) print(html)#<lxml.etree._ElementTree object at 0x034FB388> #提取数据 res=html.xpath('/html/body/ul/li/text()') print(res)#['每条资讯都是独一无二的', '这条资讯不会觉得似曾相识', '条条资讯未必都能通向知识大门']
from lxml import etree #使用etree解析html文件 html=etree.parse('./myhtml.html',etree.HTMLParser()) print(html)#<lxml.etree._ElementTree object at 0x034FB388> #提取数据,把所有的li找出来 res=html.xpath('//li/text()') print(res)#['这是我的第一条新闻', '这是我的第二条新闻', '这是我的第三条新闻', '还是你的第一条资讯', '还是你的第二条资讯', '还是你的第三条资讯', '每条资讯都是独一无二的', '这条资讯不会觉得似曾相识', '条条资讯未必都能通向知识大门']
#使用etree解析html文件 html=etree.HTML(text) print(html)# #提取数据,把指定标签的li找出来 res=html.xpath('//div[@class="son"]/ul/li/text()') print(res)#['这是我的第一条新闻', '这是我的第二条新闻', '这是我的第三条新闻'] #提取数据,把指定标签的指定属性找出来 res=html.xpath('//div[@class="oneson"]/ul/li/a/@href') print(res)#['http://www.baidu.com', 'http://www.sina.com.cn', 'http://www.sohu.com']
from lxml import etree text=''' <!DOCTYPE html> <head> <meta charset="UTF-8"> <title>这是我的标题</title> </head> <body> <div class="grandfather"> <div class="father"> <div class="son"> <ul> <li>这是我的第一条新闻</li> <li>这是我的第二条新闻</li> <li>这是我的第三条新闻</li> </ul> </div> <div class="anotherson info"> <ol> <li><a href="http://www.csdn.com">还是你的第一条资讯</li> <li><a href="http://www.tencent.com">还是你的第二条资讯</li> <li>还是你的第三条资讯</li> </ol> </div> <div class="oneson"> <ul> <li><a href="http://www.baidu.com">我的第一条链接</a></li> <li><a href="http://www.sina.com.cn">我的第二条链接</a></li> <li><a href="http://www.sohu.com">我的第三条链接</a></li> </ul> </div> </div> </div> <ul> <li>每条资讯都是独一无二的</li> <li>这条资讯不会觉得似曾相识</li> <li>条条资讯未必都能通向知识大门</li> </ul> </body> ''' #使用etree解析html文件 html=etree.HTML(text) print(html)#<Element html at 0x578988> #解析多类名标签的数据 res=html.xpath('//div[contains(@class,"info")]/ol/li/a/@href') print(res)#['http://www.csdn.com', 'http://www.tencent.com']
from lxml import etree text=''' <!DOCTYPE html> <head> <meta charset="UTF-8"> <title>这是我的标题</title> </head> <body> <div class="grandfather"> <div class="father"> <div class="son"> <ul> <li>这是我的第一条新闻</li> <li>这是我的第二条新闻</li> <li>这是我的第三条新闻</li> </ul> </div> <div class="anotherson info"> <ol> <li><a href="http://www.csdn.com">还是你的第一条资讯</li> <li><a href="http://www.tencent.com">还是你的第二条资讯</li> <li>还是你的第三条资讯</li> </ol> </div> <div class="oneson"> <ul> <li><a href="http://www.baidu.com">我的第一条链接</a></li> <li><a href="http://www.sina.com.cn">我的第二条链接</a></li> <li><a href="http://www.sohu.com">我的第三条链接</a></li> </ul> </div> </div> </div> <ul> <li>每条资讯都是独一无二的</li> <li>这条资讯不会觉得似曾相识</li> <li>条条资讯未必都能通向知识大门</li> </ul> </body> ''' #使用etree解析html文件 html=etree.HTML(text) print(html)#<Element html at 0x578988> #解析标签的各个顺位数据 #获取第一个 res=html.xpath('//li[1]/text()') print(res)#['这是我的第一条新闻', '每条资讯都是独一无二的'] #获取最后一个 res=html.xpath('//li[last()]/text()') print(res)#['这是我的第三条新闻', '还是你的第三条资讯', '条条资讯未必都能通向知识大门'] #获取前两个 res=html.xpath('//li[position()<3]/text()') print(res)#['这是我的第一条新闻', '这是我的第二条新闻', '每条资讯都是独一无二的', '这条资讯不会觉得似曾相识'] #获取倒数第三个 res=html.xpath('//li[last()-1]/text()') print(res)#['这是我的第二条新闻', '这条资讯不会觉得似曾相识']