python爬虫基础教程
爬虫介绍
- 爬虫就是程序,是从互联网中,各个网站上爬取数据(能浏览到的网页才可以爬),做数据清洗,入库
- 爬虫本质:
- 模拟http请求,获取数据,入库
- 网站/app > 抓包
我们日常使用的baidu其实就是一个大爬虫,一刻不停的在互联网中爬取各个页面爬取完后保存到自己的数据库中
你在百度搜索框中搜索百度去自己的数据库查询关键字返回回来
SEO
- 汉译为搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。目的是让其在行业内占据领先地位,获得品牌收益。很大程度上是网站经营者的一种商业行为,将自己或自己公司的排名前移。
SEM
- 我们通常简称为“SEM”。简单来说,搜索引擎营销就是基于搜索引擎平台的网络营销,利用人们对搜索引擎的依赖和使用习惯,在人们检索信息的时候将信息传递给目标用户。搜索引擎营销的基本思想是让用户发现信息,并通过点击进入网页,进一步了解所需要的信息。企业通过搜索引擎付费推广,让用户可以直接与公司客服进行交流、了解,实现交易
第三方模块的下载
第三方模块就类似与别人写好的模块,我们可以直接拿来使用
但是这种模块我们一般需要进行下载才能在我们的python里面使用(下载好后就等同于内置模块)
下载第三方模块的方式
1.pip工具
我们如果电脑中有很多版本的python解释器,那么我们一定要注意pip工具是哪一个版本解释器下的
不同的版本目录有不同的pip工具,否则容易出现使用A解释器,但是模块下载到了B解释器中
我们也可以为了避免pip冲突,在使用的时候添加对应的版本型号
python27 pip2.7
python38 pip3.8
python36 pip3.6
下载第三方模块的句式
pip install 模块名
下载第三方模块临时切换仓库
pip install 模块名-i 仓库地址
下载第三方模块指定版本(不指定默认是最新版)
pip install 模块名==版本号 -i 仓库地址
pip 下载第三方模块如果没有指定仓库地址,默认是在Python.org 国外开始的
所以我们如果遇到下载速度很慢的情况下我们就可以使用国内的镜像下载网站进行下载操作
pycharm 提供的快捷下载方式
我们在pychram 中 import 导入一个我们没有下载的第三方模块
在这个语句的上面有红小灯泡的按钮,点击找到里面的install选项
即可安装第三方模块进行使用了
'''下载第三方模块可能会遇到的问题
1. 报错并且有警告信息:
WARNING: You are using pip version 20.2.1
可能是由于你的pip工具版本较低,需要更新
d:\python38\python.exe -m pip install --upgrade pip
更新完成后再次执行下载第三方模块的命令即可
2.报错并且含有time out 关键字
说明当前网络不稳定,只需要重新尝试几次或者切换稳定网络即可解决
3.报错没有关键字
百度解决!
有一些模块时需要提前准备一些环境才可以顺利下载
4.下载速度很慢:
pip默认下载的仓库地址是国外的 python.org
我们可以切换下载的地址
pip install 模块名 -i 仓库地址
pip的仓库地址有很多 百度查询即可
清华大学 :https://pypi.tuna.tsinghua.edu.cn/simple/
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科学技术大学 :http://pypi.mirrors.ustc.edu.cn/simple/
华中科技大学:http://pypi.hustunique.com/
豆瓣源:http://pypi.douban.com/simple/
腾讯源:http://mirrors.cloud.tencent.com/pypi/simple
华为镜像源:https://repo.huaweicloud.com/repository/pypi/simple/
'''
我们可以看到在模块的后面有提示下载的仓库地址,我们根据仓库地址选择我们想要下载的模块即可解决下载速度慢的问题
网络爬虫模块之requests模块
requests模块可以模拟浏览器发送网络请求
我们使用Pip工具或者是pycharm工具下载好这个模块后
import 导入它就可以正常使用这个模块的功能了
import requests
get() get方法是朝指定网址发送请求并获取网址页面数据(相当于在浏览器地址栏中输入网址并回车访问)
res = requests.get('www.baidu.com')
print(res.content) # 获取Bytes 类型的网页数据(二进制)
res.enconding = 'utf8' # 指定编码
print(res.text) # 获取字符串类型的网页数据(默认编码为utf8)
request发送get请求
import requests
res = requests.get('https://www.cnblogs.com/ddsuifeng/p/17216087.html')
print(res.text)
request携带参数
import requests
方式一:直接拼接到路径中
res = requests.get('https://www.cnblogs.com/ddsuifeng/p/17216087.html?name=xiaoming&age=19')
方式二:使用params参数
res = requests.get('https://www.cnblogs.com/ddsuifeng/p/17216087.html',params={'name':"xiaoming",'age':19})
# print(res.text)
print(res.url)
url编码解码
import requests
from urllib.parse import quote,unquote
res = requests.get('https://www.cnblogs.com/ddsuifeng/p/17216087.html',params={'name':"彭于晏",'age':19})
# print(res.text)
# 如果是中文,在地址栏中会做url的编码:彭于晏:%E5%BD%AD%E4%BA%8E%E6%99%8F
print(res.url)
'https://www.baidu.com/s?wd=%E5%B8%85%E5%93%A5'
# 编码:
res=quote('彭于晏')
print(res)
# 解码
res=unquote('%E5%BD%AD%E4%BA%8E%E6%99%8F')
print(res)
发送post请求携带数据
import requests
# 携带登录信息,携带cookie
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36',
'Cookie': ''
}
# post请求,携带参数
data = {
'linkId': '38063872'
}
res = requests.post('https://dig.chouti.com/link/vote', headers=headers, data=data)
print(res.text)
post请求携带数据编码格式
import requests
# data对应字典,这样写,编码方式是urlencoded
requests.post(url='xxxxxxxx',data={'xxx':'yyy'})
# json对应字典,这样写,编码方式是json格式
requests.post(url='xxxxxxxx',json={'xxx':'yyy'})
# 终极方案,编码就是json格式
requests.post(url='',
data={'':1,},
headers={
'content-type':'application/json'
})
自动登录,携带cookie的两种方式
# 登录功能,一般都是post
import requests
data = {
'username': '',
'password': '',
'captcha': '3456',
'remember': 1,
'ref': 'http://www.aa7a.cn/',
'act': 'act_login'
}
res = requests.post('http://www.aa7a.cn/user.php',data=data)
print(res.text)
# 响应中会有登录成功的的cookie,
print(res.cookies) # RequestsCookieJar 跟字典一样
# 拿着这个cookie,发请求,就是登录状态
# 访问首页,get请求,携带cookie,首页返回的数据一定会有 我的账号
# 携带cookie的两种方式 方式一是字符串,方式二是字典或CookieJar对象
# 方式二:放到cookie参数中
res1=requests.get('http://www.aa7a.cn/',cookies=res.cookies)
print('616564099@qq.com' in res1.text)
requests.session的使用
# 为了保持cookie ,以后不需要携带cookie
import requests
data = {
'username': '',
'password': '',
'captcha': '3456',
'remember': 1,
'ref': 'http://www.aa7a.cn/',
'act': 'act_login'
}
session = requests.session()
res = session.post('http://www.aa7a.cn/user.php', data=data)
print(res.text)
res1 = session.get('http://www.aa7a.cn/') # 自动保持登录状态,自动携带cookie
print('616564099@qq.com' in res1.text)
响应response对象属性方法
# Response相应对象的属性和方法
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
}
respone=requests.get('http://www.jianshu.com',headers=headers)
# respone属性
print(respone.text) # 响应体转成了字符串
print(respone.content) # 响应体的二进制内容
print(respone.status_code) # 响应状态码
print(respone.headers) # 响应头
print(respone.cookies) # cookie是在响应头,cookie很重要,它单独做成了一个属性
print(respone.cookies.get_dict()) # cookieJar对象---》转成字段
print(respone.cookies.items()) # cookie的键值对
print(respone.url) # 请求地址
print(respone.history) # 不用关注
print(respone.encoding) # 响应编码格式
编码问题
我们有时候有输出res.text
时会发现乱码,请求回来的二进制转换成了字符串>>默认是utf8编码转换
如果网站是gbk编码就会产生乱码问题
- 解决方案:
res.encoding='gbk'
再打印res.text它就用gbk转码
请求携带请求头
反扒措施之一:携带请求头
- 在http请求中,请求头中有一个很重要的参数User-Agent
- 它表明了客户端类型是什么:
- Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
- 如果没有带这个请求头,有的后端就会禁止
我们如果通过requests模块模拟请求,如果没有返回数据,可以看以下是否添加了请求头
import requests
# http请求头:User-Agent,cookie,Connection,referer
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
}
res = requests.get('https://dig.chouti.com/',headers=headers)
print(res.text)
网络爬虫实战之爬取二手房数据信息
import requests
import re
res = requests.get(r"https://sh.lianjia.com/ershoufang/pudong/")
home_info = res.text
home_title_list = re.findall(' data-is_focus="" data-sl="">(.*?)</a>',home_info)
# print(home_title_list) # 二手房标题
home_addr_name = re.findall('<a href=".*?" target=".*?" data-log_index=".*?" data-el="region">(.*?) </a>',home_info)
# print(home_addr) # xx地址
home_addr_street = re.findall('<div class="positionInfo"><span class="positionIcon"></span><a href=".*?" target="_.*?" data-log_index=".*?" data-el="region">.*?</a> - <a href=".*?" target="_blank">(.*?)</a> </div>',home_info)
# print(home_addr_street) # xx地址-名称
home_data = re.findall('<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>',home_info)
# print(home_data)
home_watch = re.findall('<div class="followInfo"><span class="starIcon"></span>(.*?)</div>',home_info)
# print(home_watch)
home_money = re.findall('<div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>.*?</i></div>',home_info)
home_limit_money = re.findall('<div class="unitPrice" data-hid=".*?" data-rid=".*?" data-price=".*?"><span>(.*?)</span></div>',home_info)
all_home_data = zip(home_title_list,home_addr_name,home_addr_street,home_data,home_watch,home_money,home_limit_money)
with open('all_home_info.txt,','w',encoding='utf8') as f:
for i in all_home_data:
f.write("""
房屋标题:%s
小区名称:%s
街道名称:%s
详细信息:%s
关注程度:%s
房屋总价:%s万
房屋平米单价:%s\n
""" % i)
自动化办公领域openpyxl模块
1.excel文件后缀名问题
03 版本之前 文件名后缀为.xls
03 版本之后 文件名后缀为.xlsx
2.操作excel表格的第三方模块
xlwt往表格中写入数据、wlrd从表格中读取数据
兼容所有版本的excel文件
openpyxl 是最近几年比较火的操作excel表格的模块
03版本之前的兼容性比较差
# 也有许多别的模块可以操作excel并且功能更加强大>>>>>>pandas
3.openpyxl 模块操作
官方文档:https://openpyxl.readthedocs.io/en/stable/tutorial.html
上面有openpyxl的使用说明
from openpyxl import Workbook
# 创建excel文件
变量名 = Workbook()
# 保存excel文件
变量名.save('文件名.xlsx')
# 在一个excel文件中创建多个工作簿(sheet)
home_info_excel = Workbook()
home_sheet1 = home_info_excel.create_sheet('就是牛')
home_sheet2 = home_info_excel.create_sheet('还是牛')
home_sheet3 = home_info_excel.create_sheet('牛上天了')
home_info_excel.save(r'text.xlsx')
我们可以看到excel文件本身就会有一个sheet工作簿
所以我们新增的工作簿都在他的后面
我们也可以通过在creat_sheet('工作簿名称',0) 加参数来控制我们新建工作簿的位置
后面的数字为索引位置
我们也可以二次修改工作簿名称:
原有工作簿.title = '想要修改的工作簿名字'
# 切记,需要先关闭excel在操作,不然会报错
工作簿.sheet_properties.tabColor = "1072BA" # 修改工作簿的颜色
填写表格文件中数据的方式:
1.
工作簿.append([1,2,3,4]) # 表头字段 每行1,2,3,4
工作簿.append([1,2,3,4])
工作簿.append([1,2,3,4])
工作簿.append([1,2,3,4])
工作簿.append([1,2,3,4])
工作簿.append([1,2,3,4])
2.
工作簿['坐标'] = 212 # 在当前工作簿指定坐标上写212数据
3.
工作簿.cell(row=1, column=1, value='212') # row 为行 column 为列 也相当于坐标
# 相当于在第一行第一列写数据212
填写数学公式:
工作簿['坐标'] = '=sum(坐标:坐标)'
# openpyxl主要用于数据的写入 至于后续的表单操作它并不是很擅长 如果想做需要更高级的模块pandas
pandas模块
import requests
import re
import pandas
from openpyxl import Workbook
res = requests.get(r"https://sh.lianjia.com/ershoufang/pudong/")
home_info = res.text
home_title_list = re.findall(' data-is_focus="" data-sl="">(.*?)</a>', home_info)
# print(home_title_list) # 二手房标题
home_addr_name = re.findall('<a href=".*?" target=".*?" data-log_index=".*?" data-el="region">(.*?) </a>', home_info)
# print(home_addr) # xx地址
home_addr_street = re.findall(
'<div class="positionInfo"><span class="positionIcon"></span><a href=".*?" target="_.*?" data-log_index=".*?" data-el="region">.*?</a> - <a href=".*?" target="_blank">(.*?)</a> </div>',
home_info)
# print(home_addr_street) # xx地址-名称
home_data = re.findall('<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>', home_info)
# print(home_data)
home_watch = re.findall('<div class="followInfo"><span class="starIcon"></span>(.*?)</div>', home_info)
# print(home_watch)
home_money = re.findall('<div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>.*?</i></div>',
home_info)
home_limit_money = re.findall(
'<div class="unitPrice" data-hid=".*?" data-rid=".*?" data-price=".*?"><span>(.*?)</span></div>', home_info)
info_dict = {'房屋简介': home_title_list,
'小区地址': home_addr_name,
'所在街道': home_addr_street,
'房屋详细信息': home_data,
'关注度': home_watch,
'房屋总价': home_money,
'房屋平米单价': home_limit_money
}
df_info = pandas.DataFrame(info_dict)
df_info.to_excel(r'home_info.xlsx')
excel软件正常可以打开操作的数据集在10万左右 一旦数据集过大 软件操作几乎无效
爬取二手房指定页数的数据
import requests
import re
from openpyxl import Workbook
def get_pudong_home_info(x):
home_data_file = Workbook()
home_data_file_sheet = home_data_file.create_sheet(rf'{x}页房屋信息',0)
home_data_file_sheet.append(['房屋信息','小区地址','所在街道','详细信息','受关注程度','房屋总价','房屋平米单价'])
for num in range(1,(x+1)):
res = requests.get(rf"https://sh.lianjia.com/ershoufang/pudong/pg{num}/")
home_info = res.text
home_title_list = re.findall(' data-is_focus="" data-sl="">(.*?)</a>', home_info)
home_addr_name = re.findall('<a href=".*?" target=".*?" data-log_index=".*?" data-el="region">(.*?) </a>',home_info)
home_addr_street = re.findall(
'<div class="positionInfo"><span class="positionIcon"></span><a href=".*?" target="_.*?" data-log_index=".*?" data-el="region">.*?</a> - <a href=".*?" target="_blank">(.*?)</a> </div>',
home_info)
home_data = re.findall('<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>', home_info)
home_watch = re.findall('<div class="followInfo"><span class="starIcon"></span>(.*?)</div>', home_info)
home_money = re.findall('<div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>.*?</i></div>',home_info)
home_limit_money = re.findall('<div class="unitPrice" data-hid=".*?" data-rid=".*?" data-price=".*?"><span>(.*?)</span></div>', home_info)
a = zip(home_title_list, home_addr_name, home_addr_street, home_data, home_watch, home_money, home_limit_money)
for i in a:
home_data_file_sheet.append(i)
home_data_file.save('home_info_openpy.xlsx')
print(f'已生成{x}页的二手房信息~')
get_pudong_home_info(10)
requests模块高级用法
我们使用requsts模块发送http请求,返回的数据会有xml格式,也有json格式
import requests
data = {
'cname': '',
'pid': '',
'keyword': '500',
'pageIndex': 1,
'pageSize': 10,
}
res = requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword',data=data)
# print(res.text) # json 格式字符串---
print(type(res.json())) # 转成对象 字典对象
解析json格式网站>>json解析
ssl认证
http协议: 明文传输
https协议: http+ssl/tsl
HTTP+ SSL / TLS,也就是在 http上又加了一层处理加密信息的模块,比 http安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性
参考博客>
我们在以后遇到证书提示错误的问题 报错: ssl...
解决方案:
1.不验证证书
import requests
respone=requests.get('https://www.12306.cn',verify=False)
#不验证证书,报警告,返回200
print(respone.status_code)
2.关闭警告
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
respone=requests.get('https://www.12306.cn',verify=False)
print(respone.status_code)
** 3.手动携带证书(了解)**
import requests
respone=requests.get('https://www.12306.cn',
cert=('/path/server.crt',
'/path/key'))
print(respone.status_code)
使用代理
如果爬虫使用自身ip访问,很可能会被封ip,这样以后我们就不能访问了
我们可以使用使用代理ip
代理:收费和免费(不稳定)
- 高匿代理和透明代理
高匿,服务端拿不到真实客户端的ip地址
透明:服务端能拿到真实客户端的ip地址
后端获取真实客户端ip
# http请求头中有个:X-Forwarded-For: client1, proxy1, proxy2, proxy3
-x-forworded-for
-获得HTTP请求端真实的IP
超时设置
我们可以设置请求访问时常
import requests
respone=requests.get('https://www.baidu.com',timeout=0.0001)
异常处理
import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型
try:
r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
print('===:')
# except ConnectionError: #网络不通
# print('-----')
# except Timeout:
# print('aaaaa')
except RequestException:
print('Error')
上传文件
import requests
files = {'file': open('美女.png', 'rb')}
respone = requests.post('http://httpbin.org/post', files=files)
print(respone.status_code)
代理池搭建
- requests发送请求使用代理
搭建免费的代理池:https://github.com/jhao104/proxy_pool
python:爬虫+flask写的
架构:看下图
搭建步骤
1.使用git将项目拉下来
git clone [https://github.com/jhao104/proxy_pool.git](https://github.com/jhao104/proxy_pool.git)
2.使用pycharm打开
打开项目会弹出窗口,可以选择自己已经有的虚拟环境,如果在这边确定了,依赖就自动安装了
我是自己建了一个虚拟环境
3 安装依赖:pip install -r requirements.txt
4 修改配置文件(redis的地址) > settings.py
HOST = "0.0.0.0"
PORT = 5010
DB_CONN = 'redis://127.0.0.1:6379/1'
PROXY_FETCHER #爬取哪些免费代理网站
把redis启动起来!
自己设置redis自启动也行..
5.启动爬虫程序
python proxyPool.py schedule
6.启动服务端
python proxyPool.py server
7.发送测试请求
[http://127.0.0.1:5010/get/](http://127.0.0.1:5010/get/)
使用python代码随机生成代理发送请求
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
# 获取代理
res = requests.get('http://127.0.0.1:5010/get/').json()
proxies = {}
if res['https']:
proxies['https'] = res['proxy']
else:
proxies['http'] = res['proxy']
print(proxies)
res = requests.post('https://www.cnblogs.com', proxies=proxies,verify=False)
# res = requests.post('https://www.cnblogs.com')
print(res)
django后端获取客户端的ip
# 建立django后端---》index地址---》访问就返回访问者的ip
# django代码---》不要忘记改配置文件
# 路由
path('', index),
# 视图函数
def index(request):
ip = request.META.get('REMOTE_ADDR')
print('ip地址是', ip)
return HttpResponse(ip)
# 测试端:
# import requests
# from requests.packages import urllib3
# urllib3.disable_warnings() #关闭警告
# # 获取代理
# res = requests.get('http://127.0.0.1:5010/get/').json()
# proxies = {}
# if res['https']:
# proxies['https'] = res['proxy']
# else:
# proxies['http'] = res['proxy']
#
# print(proxies)
# res=requests.get('http://101.43.19.239/', proxies=proxies,verify=False)
# print(res.text)
from threading import Thread
import requests
def task():
res = requests.get('http://101.43.19.239/')
print(res.text)
for i in range(10000000):
t = Thread(target=task)
t.start()
爬取xx视频网站
我们首先进入到视频网站,进行分析
我们可以看到,我们只要往下滑动页面,网站会自动向后端发送请求,获取数据
我们打开这个请求发送一下试试
https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=24&mrd=0.8580976828972651&filterIds=1346772,1433296,1420573,1397663,1420554,1345448,1423918,1419072,1445727,1407100,1453483,1445729,1431980,1054403,1443860,1443007,1403468,1398399,1241066,1416918,1360133,1399969,1427185,1429224
我们可以看到很多的a标签,这样我们可以猜测这个链接就是获取视频列表的
将多余部分去掉看看能正常访问?
可以正常访问,那么我们就可以在继续猜测路由中内容
https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=24
categoryId:类似分类 我们现在处于人物板块
start=24: 起始位置 ,因为我们是在滑动到底部才发送的请求
reqType=5 不知道是啥
至此我们已经分析得出来了结果,所以我们现在用python代码尝试获取这些资源
res = requests.get(r'https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0')
# print(res.text)
video_id_list = re.findall('<a href="(?P<id>.*?)" class="vervideo-lilink actplay">',res.text)
print(video_id_list)
这样我们就能获取到所有的vedioid了
我们只需要将video_id拼接以下就可以访问视频主页面了
我们进入视频主页面在进行分析~
我们直接访问这个链接就可以拿到视频
我们用代码获取以下即可
发现视频链接处,只有此处不同,所以我们可以用正则在匹配出来视频地址
还是年轻了.. 因为获取不到,做了反扒措施
我就得弄你!
原来是我们进入页面后 它偷偷又发了一个请求拿的视频!
就藏在这里哦!
那我们直接去那这个东西,取值就行了
import requests
import urllib3
import re
urllib3.disable_warnings() # 关闭警告
# 获取代理
res = requests.get('http://127.0.0.1:5010/get/').json()
proxies = {}
if res['https']:
proxies['https'] = res['proxy']
else:
proxies['http'] = res['proxy']
res = requests.get(r'https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0', proxies=proxies,
verify=False, )
video_id_list = re.findall('<a href="(?P<id>.*?)" class="vervideo-lilink actplay">', res.text)
for video_id in video_id_list:
video_url = "https://www.pearvideo.com/" + video_id
video_id = video_id.split('_')[-1]
headers = {
'Referer': 'https://www.pearvideo.com/video_%s' % video_id
}
# res1 = requests.get(video_url,headers=headers)
# print(res1.text)
# contId就是video_id都一样
res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.28966900292681386'%video_id,headers=headers).json()
# 因为它返回了json格式数据,所以我们.json 让数据变为字典格式
print(res1)
我们看到它的数据格式为: json格式,我们转换成了字典,我们只需要找到对应的键获取值就行了
但是我们打开网页会发现,打不开 ,我去
我们可以看到能打开的视频与打不开的视频的差别
就是差在 cont-上,所以我们可以通过字符串的替换来将它变为能打开的视频链接
mp4_url = res1['videoInfo']['videos']['srcUrl']
mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0],'cont-%s'%video_id)
print(mp4_url)
我们通过 with open 来进行保存即可
# res2 = requests.get(mp4_url)
# with open(r'D:\pythonProject\爬虫\videolib\video%s.mp4' % video_id, 'wb') as f:
# for line in res2.iter_content():
# f.write(line)
进阶.> 起10个线程/获取5页视频数据
import requests
import urllib3
import re
from threading import Thread
urllib3.disable_warnings() # 关闭警告
# 获取代理
res = requests.get('http://127.0.0.1:5010/get/').json()
proxies = {}
if res['https']:
proxies['https'] = res['proxy']
else:
proxies['http'] = res['proxy']
def video_handle():
start_num = 0
while start_num < 24 * 5:
res = requests.get(r'https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=%s'%start_num, proxies=proxies,
verify=False, )
video_id_list = re.findall('<a href="(?P<id>.*?)" class="vervideo-lilink actplay">', res.text)
for video_id in video_id_list:
video_url = "https://www.pearvideo.com/" + video_id
video_id = video_id.split('_')[-1]
headers = {
'Referer': 'https://www.pearvideo.com/video_%s' % video_id
}
# res1 = requests.get(video_url,headers=headers)
# print(res1.text)
# contId就是video_id都一样
res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.28966900292681386'%video_id,headers=headers).json()
# 因为它返回了json格式数据,所以我们.json 让数据变为字典格式
mp4_url = res1['videoInfo']['videos']['srcUrl']
mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0],'cont-%s'%video_id)
# print(mp4_url)
start_num += 1
print(mp4_url)
print(start_num)
# res2 = requests.get(mp4_url)
# with open(r'D:\pythonProject\爬虫\videolib\video%s.mp4' % video_id, 'wb') as f:
# for line in res2.iter_content():
# f.write(line)
for i in range(10):
t = Thread(target=video_handle)
t.start()
爬取xx新闻网站
https://www.autohome.com.cn/all/1/#liststart
对此网址分析,
路由中携带的数字 1就是第一页,第二页 将路由数字变为2即可
至此我们就能获取到页数信息了
import requests
# pip install beautifulsoup4 解析xml的库
from bs4 import BeautifulSoup
res = requests.get('https://www.autohome.com.cn/all/1/#liststart')
# print(res.text)
# 第一个参数是要解析的文本 str
# 第二个参数是:解析的解析器 html.parser:内置解析器 lxml:第三方需要额外安装
soup = BeautifulSoup(res.text, 'html.parser')
# 查找所有类名叫article的ul标签 find_all
ul_list = soup.find_all(name='ul', class_='article')
for ul in ul_list:
li_list = ul.find_all(name='li')
# print(len(li_list))
for li in li_list:
h3 = li.find(name='h3')
if h3: # 不是广告
title = h3.text
url = 'https:' + li.find('a').attrs['href']
desc = li.find('p').text
img = li.find(name='img').attrs['src']
print('''
新闻标题:%s
新闻连接:%s
新闻摘要:%s
新闻图片:%s
''' % (title, url, desc, img))
python爬虫基础教程的更多相关文章
- 小白必看Python视频基础教程
Python的排名从去年开始就借助人工智能持续上升,现在它已经成为了第一名.Python的火热,也带动了工程师们的就业热.可能你也想通过学习加入这个炙手可热的行业,可以看看Python视频基础教程,小 ...
- Python爬虫基础
前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...
- Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分
1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...
- Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分
1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...
- Python数据分析基础教程
Python数据分析基础教程(第2版)(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1_FsReTBCaL_PzKhM0o6l0g 提取码:nkhw 复制这段内容后 ...
- python爬虫-基础入门-python爬虫突破封锁
python爬虫-基础入门-python爬虫突破封锁 >> 相关概念 >> request概念:是从客户端向服务器发出请求,包括用户提交的信息及客户端的一些信息.客户端可通过H ...
- python爬虫-基础入门-爬取整个网站《3》
python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python ...
- python爬虫-基础入门-爬取整个网站《2》
python爬虫-基础入门-爬取整个网站<2> 描述: 开场白已在<python爬虫-基础入门-爬取整个网站<1>>中描述过了,这里不在描述,只附上 python3 ...
- python爬虫-基础入门-爬取整个网站《1》
python爬虫-基础入门-爬取整个网站<1> 描述: 使用环境:python2.7.15 ,开发工具:pycharm,现爬取一个网站页面(http://www.baidu.com)所有数 ...
- Python Numpy基础教程
Python Numpy基础教程 本文是一个关于Python numpy的基础学习教程,其中,Python版本为Python 3.x 什么是Numpy Numpy = Numerical + Pyth ...
随机推荐
- linux中 查看 CPU 内存负载 磁盘IO 网络IO情况
1.压测时如何观察机器的CPU负载 先来看一个最最常用的监测linux机器性能的命令,就是top命令,直接在linux命令行只能够输入top指令就可以了,然后我们这里来给大家解释一下,top指令展示出 ...
- 版图 shrink
先打开模拟部分的版图,然后在ciw 里面执行 dbCreateXFormPCell(geGetEditCellView() "libName") 然后在"libName& ...
- opencv基本函数详解笔记
一.读取保存图片 Mat scrImage = imread("1.jpg"); //显示图像 imshow("原图", scrImage); //窗口等待 w ...
- Win32游戏开发程序——第一个“游戏”程序
在中国大学慕课上面看到的一道题目,算得上是入门吧. 题目如下: 在"HelloWorldGame"游戏代码的基础上,试着进行如下的上机练习(能实现至少一个即可): • 将文字修改 ...
- qt的其他窗口
一.qt的其他类族 2.Qlabel ui->setupUi(this); QFont font;//确立一个字体对象 font.setFamily("华文行楷");//字体 ...
- 【闫式dp分析法】
- Maven中的DependencyManagement 和 Dependencies
Maven 使用dependencyManagement 元素来提供了一种管理依赖版本号的方式. 通常会在一个组织或者项目的最顶层的父POM 中看到dependencyManagement 元素. 使 ...
- Vue组件template中html代码自动补齐设置
1.vscode设置==>扩展==>JSON==>在settings.json中编辑 2.在最后 } 前添加如下代码保存文件即可 // 自动补全模板字符串 "emmet.t ...
- python3GUI--轮播图效果展示By:PyQt5(附源码下载地址)
@ 目录 一.前言 二.展示 1.酷我音乐 2.QQ飞车 3.虎牙 4.网易云音乐 5.英雄联盟 6.英雄联盟(Pro) 7.腾讯视频 三.源代码 1.demo02GUI.py 2.engine.py ...
- js 全屏显示指定区域
小猪最近使用vue开发项目的时候,需要实现将指定区域全拼展示的操作. 小猪选择使用js来实现,实现原理:使用requestFullscreen()方法将指定的dom元素在全屏模式下打开. 支持的部分浏 ...