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

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

#导入一个url库
from urllib.request import urlopen

url='http://www.baidu.com'
#读取并解析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 requests

url='https://www.sogou.com/web?query=周杰伦'
#爬取会被拦截,因此需要设置请求头User-Agent
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'
}

resp=requests.get(url,headers=headers)

#将结果用text文本形式解析出来
print(resp.text)

3、post请求

百度翻译

import requests

url='https://fanyi.baidu.com/sug'
#爬取会被拦截,因此需要设置请求头User-Agent
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'
}
str=input('请输入要翻译的词汇')
#使用json来post参数
data={
	'kw':str
}
#发送post请求
resp=requests.post(url,headers=headers,data=data)

#将结果用text\json文本形式解析出来
print(resp.json())

4、参数拼接

import requests

url='https://moive.douban.com/j/chart/toplist'
#重新封装参数
param={
	'type':"24",
	"interval_id":"100:900",
	"action":"",
	"start":0,
	"limit":20
}
#爬取会被拦截,因此需要设置请求头User-Agent
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请求
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=re.compile(r"\d+")
res=obj.finditer("我的电话号码是:10086,我们的电话是10010")
print(res)#
for item in res:
	print(item.group())#10086 10010

res=obj.findall('hhaha,我的数字是2334235')
print(res)#['2334235']

str='''
张三丰
李慕白
慕容复
全冠清
马夫人
'''
#(?P<分组名字>正则规则)可以单独从正则匹配的内容中进一步提取内容 obj=re.compile(r'
(?P.*?)
'
,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

唯美壁纸图片
地址:https://umei.cc/bizhitupian/weimeibizhi/

import requests
from bs4 import BeautifulSoup
import time
#1、拿到主页面的源代码,然后提取到子页面的连接地址,href
url="https://umei.cc/bizhitupian/weimeibizhi/"
resp=requests.get(url)
resp.encoding='utf-8'#处理乱码
#print(resp.text)

#类似于将response结果解析成html
main_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="https://umei.cc"+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")#获取标签用find
	src=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 requests
from lxml import etree

xml='''

  1
  野花遍地香
  1.23
  臭豆腐
  
    周大强
    周芷若
    周杰伦
    蔡依林
    
大聪明1
大聪明2
大聪明3
胖胖丫 胖胖不成
'''
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="http://www.baidu.com">百度</a></li>
    <li><a href="http://www.google.com">谷歌</a></li>
    <li><a href="http://www.sogou.com">搜狗</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 requests
from 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"))#['http://www.baidu.com', 'http://www.google.com', 'http://www.sogou.com']
print(tree.xpath("/html/body/div[1]/text()"))#['李嘉诚']

10、爬取XXX网案例

网址:https://beijing.zbj.com/sem_search/f/?kw=saas

#拿到页面源代码
#提取和解析数据
import requests
from lxml import etree

url='https://beijing.zbj.com/sem_search/f/?kw=saas'
resp=requests.get(url)
#print(resp.text)
#解析成html源码
html=etree.HTML(resp.text)
#拿到每个服务商的div
divs=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进阶-模拟登录

爬取网页:https://user.17k.com/www/bookshelf/read.html

#登录-》得到cookie
#带着cookie去请求数据rul-》书架上的内容
#把以上两个操作连接弃疗
#可以使用session进行请求-》session可以认为是一连串的请求,在这个过程中的cookie不会跌势
import requests
#获取会话
session=requests.session()
#登录
url='https://passport.17k.com/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('https://user.17k.com/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 requests
url='https://www.pearvideo.com/video_1742661'
contId=url.split("_")[1]

videoStatusUrl=f'https://www.pearvideo.com/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':'https://www.pearvideo.com/video_1742661'
}
resp=requests.get(videoStatusUrl,headers=headers)
#print(resp.text)#获取到所谓的地址
#用字典来接受resp请求回来的数据
dic=resp.json()
srcUrl=dic['videoInfo']['videos']['srcUrl']
print(srcUrl)#https://video.pearvideo.com/mp4/adshort/20210928/1632884203015-12314282-141526_adpkg-ad_hd.mp4
systemTime=dic['systemTime']
print(systemTime)
#真实视频地址是使用contId的数据替换了systemTime部分的字符
srcUrl=srcUrl.replace(systemTime,f'cont-{contId}')
print(srcUrl)#拿到真实视频地址 https://video.pearvideo.com/mp4/adshort/20210928/cont-1742661-12314282-141526_adpkg-ad_hd.mp4
#下载视频
with open("./videos/myvideo.mp4",mode='wb') as fp:
	fp.write(requests.get(srcUrl).content)#文件下载下来了

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

代理:通过第三方的机器去发送请求
去zdaye.com去找一个免费代理,要透明的不要高匿。普匿

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

15、抓取XX云音乐评论

抓取地址:https://music.163.com/#/song?id=1879112530
太难了,我拒绝,回头在来做这个案例

你可能感兴趣的:(python,python,xml,爬虫)