失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python爬虫01-get请求 post请求 参数拼接 re正则解析 bs解析 xpath解析xml及html

python爬虫01-get请求 post请求 参数拼接 re正则解析 bs解析 xpath解析xml及html

时间:2021-02-03 23:45:29

相关推荐

python爬虫01-get请求 post请求 参数拼接 re正则解析 bs解析 xpath解析xml及html

1、一个简单的读取网页的小案例

#导入一个url库from urllib.request import urlopenurl=''#读取并解析url地址response=urlopen(url)#获取url的地址的结果集并有utf-8编码res=response.read().decode('utf-8')#写入结果到文件中with open("mybaidu.html",mode='w',encoding='utf-8') as fp:fp.write(res)print('over')

2、get请求

搜狗搜索

import requestsurl='/web?query=周杰伦'#爬取会被拦截,因此需要设置请求头User-Agentheaders={'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'}resp=requests.get(url,headers=headers)#将结果用text文本形式解析出来print(resp.text)

3、post请求

百度翻译

import requestsurl='/sug'#爬取会被拦截,因此需要设置请求头User-Agentheaders={'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'}str=input('请输入要翻译的词汇')#使用json来post参数data={'kw':str}#发送post请求resp=requests.post(url,headers=headers,data=data)#将结果用text\json文本形式解析出来print(resp.json())

4、参数拼接

import requestsurl='/j/chart/toplist'#重新封装参数param={'type':"24","interval_id":"100:900","action":"","start":0,"limit":20}#爬取会被拦截,因此需要设置请求头User-Agentheaders={'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请求resp=requests.get(url,headers=headers,params=param)#将结果用text\json文本形式解析出来print(resp.joson())resp.close()

5、数据解析

1、re解析(正则表达式解析)2、bs4解析(代码简单,效率较慢)3、xpath解析(比较流行的第三方库)

6、re正则解析

一些正则的规则

#导入正则模块import re#findall:匹配字符串中所有符合正则的内容,返回的是列表lst=re.findall(r"\d+","我的电话号码是:10086,我们的电话是10010")print(lst)#['10086', '10010']#finditer:匹配字符串中所有符合正则的内容,返回的迭代器,从迭代器中拿内容要group函数iter=re.finditer(r"\d+","我的电话号码是:10086,我们的电话是10010")for item in iter:print(item.group())#group可以直接解析处item的内容,10086 10010#search找到一个结果就返回。返回的结果是match对象,拿内容要group函数search=re.search(r"\d+","我的电话号码是:10086,我们的电话是10010")print(search.group())#10086 匹配了第一条数据#match从头开始匹配# match=re.match(r"\d+","我的电话号码是:10086,我们的电话是10010")# print(match.group())#预加载正则表达式obj=pile(r"\d+")res=obj.finditer("我的电话号码是:10086,我们的电话是10010")print(res)#<callable_iterator object at 0x01302DD8>for item in res:print(item.group())#10086 10010res=obj.findall('hhaha,我的数字是2334235')print(res)#['2334235']str='''<div class="jay"><span id="1">张三丰</span></div><div class="jj"><span id="2">李慕白</span></div><div class="jolin"><span id="3">慕容复</span></div><div class="stkar"><span id="4">全冠清</span></div><div class="tory"><span id="5">马夫人</span></div>'''#(?P<分组名字>正则规则)可以单独从正则匹配的内容中进一步提取内容obj=pile(r'<div class="(?P<class>.*?)"><span id="\d+">(?P<position>.*?)</span></div>',re.S)#re.S:让.能匹配换行符result=obj.finditer(str)#返回迭代器对象for item in result:print(item.group("position"),item.group("class"))#输出张三丰 jay李慕白 jj慕容复 jolin全冠清 stkar马夫人 tory

7、bs解析

需要安装bs4模块

pip install Beautifulsoup4

唯美壁纸图片

地址:/bizhitupian/weimeibizhi/

import requestsfrom bs4 import BeautifulSoupimport time#1、拿到主页面的源代码,然后提取到子页面的连接地址,hrefurl="/bizhitupian/weimeibizhi/"resp=requests.get(url)resp.encoding='utf-8'#处理乱码#print(resp.text)#类似于将response结果解析成htmlmain_page=BeautifulSoup(resp.text,"html.parser")#html.parser忽略警告alist=main_page.find("div",class_="TypeList").findAll("a")#找到class名为TypeList的div下的a标签#print(alist)#去拿子页面的连接for item in alist:href=""+item.get('href')#print(href)#2、通过href拿到子页面的内容,从子页面中找到图片的下载地址img-src#拿到子页面的源代码child_page_resp=requests.get(href)child_page_resp.encoding='utf-8'child_page_text=child_page_resp.text#从子页面中拿到图片的下载路径#进一步解析子页面内容child_page=BeautifulSoup(child_page_text,"html.parser")p=child_page.find("p",align='center')#最好去查找classs或id值img=p.find("img")#获取标签用findsrc=img.get('src')#获取属性用get#print(src)#3、下载图片img_resp=requests.get(src)#img_resp.content获取响应的字节img_name=src.split('/')[-1]#拿到url地址中最后一部分(也就是文件名部分,不包含路径)with open("./images/"+img_name,mode='wb') as fp:fp.write(img_resp.content)#把图片写入到文件中去print('over',img_name)time.sleep(1)print('all over')

结果:

顺利下载图片到images目录里

8、XPath解析xml

xpath是在xml文档中搜索内容的一门语言

html是xml的一个子集

通过节点路径来查找节点

需要安装lxml模块

pip install lxml

import requestsfrom lxml import etreexml='''<book><id>1</id><name>野花遍地香</name><price>1.23</price><nick>臭豆腐</nick><author><nick id="10086">周大强</nick><nick id="10010">周芷若</nick><nick class="joy">周杰伦</nick><nick class="jolin">蔡依林</nick><div><nick>大聪明1</nick></div> <span><nick>大聪明2</nick><div><nick>大聪明3</nick></div></span></author><partner><nick id="ppc">胖胖丫</nick><nick id="'ppbc">胖胖不成</nick></partner></book>'''tree=etree.XML(xml)#/表层级关系/是根节点,text()是获取节点内部的内容result=tree.xpath('/book/name/text()')print(result)#['野花遍地香']#获取同一节点下多个同名节点result=tree.xpath('/book/author/nick/text()')print(result)#['周大强', '周芷若', '周杰伦', '蔡依林']#获取同一节点下不同层级(叔伯关系及更多后代)的节点,author下所有nick节点result=tree.xpath('/book/author//nick/text()')print(result)#['周大强', '周芷若', '周杰伦', '蔡依林', '大聪明1', '大聪明2', '大聪明3']#节点通配符*表示任意节点result=tree.xpath('/book/author/*/nick/text()')print(result)#['大聪明1', '大聪明2']

9、XPath解析html文件

根目录下创建forxpath.html

forxpath.html

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"/><title>Title</title></head><body><ul><li><a href="">百度</a></li><li><a href="">谷歌</a></li><li><a href="">搜狗</a></li></ul><ol><li><a href="feiji">飞机</a></li><li><a href="daopao">大炮</a></li><li><a href="huoche">火车</a></li></ol><div class="job">李嘉诚</div><div class="common">胡辣汤</div></body></html>

入口程序

main.py

import requestsfrom lxml import etree#etree可以直接解析html文件tree=etree.parse('forxpath.html')#/html是匹配html标签的意思#result=tree.xpath('/html')#匹配这个路径的具体文本result=tree.xpath('/html/body/ul/li/a/text()')print(result)#['百度', '谷歌', '搜狗']result=tree.xpath('/html/body/ul/li[1]/a/text()')print(result)#['百度']#匹配某个标签的某个属性的值result=tree.xpath('/html/body/ol/li/a[@href="daopao"]/text()')print(result)#相对查找ol_li_list=tree.xpath('/html/body/ol/li')for item in ol_li_list:#./是相对查找的意思res=item.xpath("./a/text()")print(res)#['飞机'] ['大炮'] ['火车']for item in ol_li_list:# 匹配属性直接使用@res = item.xpath('./a/@href')print(res)#'feiji'],['daopao'],['huoche']#拿属性的简便写法print(tree.xpath("/html/body/ul/li/a/@href"))#['', '', '']print(tree.xpath("/html/body/div[1]/text()"))#['李嘉诚']

10、爬取XXX网案例

网址:/sem_search/f/?kw=saas

#拿到页面源代码#提取和解析数据import requestsfrom lxml import etreeurl='/sem_search/f/?kw=saas'resp=requests.get(url)#print(resp.text)#解析成html源码html=etree.HTML(resp.text)#拿到每个服务商的divdivs=html.xpath('/html/body/div[6]/div/div/div[2]/div[5]/div[1]/div')for div in divs:price=div.xpath("./div/div/a/div[2]/div[1]/span[1]/text()")[0].strip("¥")title=div.xpath("./div/div/a/div[2]/div[2]/p/text()")companyName=div.xpath('.//*[@id="utopia_widget_76"]/a[1]/div[1]/p/text()')[1]cities=div.xpath('.//*[@id="utopia_widget_76"]/a[1]/div[1]/div/span/text()')print(price)print(title)print(companyName)print(cities)

结果:

2513['OA进销存CRM项目管理ERP系统', ' 行业软件开发定制']潮瑞科技|8年诚信老店['北京']700['系统|CRM系统|微信开发|微信公众平台开发|分销']坤创科技-致力于为企业提供优质移动互联网解决方案['北京']更多数据不再展示

11、requests进阶

1、模拟浏览器登录–》处理cookie

2、防盗链处理-》专区梨视频数据

3、代理-》房子被封ip

综合训练:

抓取网易云音乐评论信息

12、requests进阶-模拟登录

爬取网页:/www/bookshelf/read.html

#登录-》得到cookie#带着cookie去请求数据rul-》书架上的内容#把以上两个操作连接弃疗#可以使用session进行请求-》session可以认为是一连串的请求,在这个过程中的cookie不会跌势import requests#获取会话session=requests.session()#登录url='/ck/user/login'datas={'loginName': 18618412082,'password': 'hujian790402'}resp1=session.post(url,data=datas)#print(resp.text)#返回了请求的网页#print(resp.cookies)#返回了一系列的cookie值#拿书架上的数据,不可以使用requests.get发送新的请求,而应该使用session,因为session保留了对话信息resp2=session.get('/ck/author/shelf?page=1&appKey=2406394919')print(resp2.json())

结果,拿到数数据

13、requests进阶-反防盗链抓取XX视频数据

梨视频的视频地址使用时间戳替代了真实视频地址,要把相应的时间戳替换成视频原始地址

Referer防盗链,溯源(本次请求的上一级是谁)所以需要在headers里添加Referer属性

#1、拿到contId#2.拿到videoStatus返回的json-》srcURL#3对srcURL里的内容进行修整#4、下载对应的视频import requestsurl='/video_1742661'contId=url.split("_")[1]videoStatusUrl=f'/videoStatus.jsp?contId={contId}&mrd=0.537255007735485'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','Referer':'/video_1742661'}resp=requests.get(videoStatusUrl,headers=headers)#print(resp.text)#获取到所谓的地址#用字典来接受resp请求回来的数据dic=resp.json()srcUrl=dic['videoInfo']['videos']['srcUrl']print(srcUrl)#/mp4/adshort/0928/1632884203015-12314282-141526_adpkg-ad_hd.mp4systemTime=dic['systemTime']print(systemTime)#真实视频地址是使用contId的数据替换了systemTime部分的字符srcUrl=srcUrl.replace(systemTime,f'cont-{contId}')print(srcUrl)#拿到真实视频地址 /mp4/adshort/0928/cont-1742661-12314282-141526_adpkg-ad_hd.mp4#下载视频with open("./videos/myvideo.mp4",mode='wb') as fp:fp.write(requests.get(srcUrl).content)#文件下载下来了

14、代理(不推荐,有法律问题)

代理:通过第三方的机器去发送请求

去去找一个免费代理,要透明的不要高匿。普匿

import requests#去找一个免费代理,透明的不要高匿。普匿#113.238.142.2083128 47.106.127.21939746 122.51.207.2448888#设置代理proxy={'https':'113.238.142.208:3128'}url=''#使用代理访问链接resp=requests.get(url,proxies=proxy)resp.encoding='utf-8'print(resp.text)#找的代理当时可以返回正确结果

15、抓取XX云音乐评论

抓取地址:/#/song?id=1879112530

太难了,我拒绝,回头在来做这个案例

python爬虫01-get请求 post请求 参数拼接 re正则解析 bs解析 xpath解析xml及html文件 requests进阶模拟登录 反盗链zhuanqu 代理

如果觉得《python爬虫01-get请求 post请求 参数拼接 re正则解析 bs解析 xpath解析xml及html》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。