#导入一个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')
搜狗搜索
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)
百度翻译
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())
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()
一些正则的规则
#导入正则模块
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
需要安装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目录里
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']
根目录下创建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()"))#['李嘉诚']
网址: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系统|微信开发|微信公众平台开发|分销']
坤创科技-致力于为企业提供优质移动互联网解决方案
['北京']
更多数据不再展示
1、模拟浏览器登录–》处理cookie
2、防盗链处理-》专区梨视频数据
3、代理-》房子被封ip
综合训练:
抓取网易云音乐评论信息
爬取网页: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())
结果,拿到数数据
梨视频的视频地址使用时间戳替代了真实视频地址,要把相应的时间戳替换成视频原始地址
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)#文件下载下来了
代理:通过第三方的机器去发送请求
去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)#找的代理当时可以返回正确结果
抓取地址:https://music.163.com/#/song?id=1879112530
太难了,我拒绝,回头在来做这个案例