requests.get爬虫模块参数
地址和请求头参数--url和header
res = requests.get(url,headers=headers) 向网站发起请求,并获取响应对象
参数
- url :需要抓取的URL地址
- headers : 请求头
- timeout : 超时时间,超过时间会抛出异常
响应对象(res)属性
- encoding :响应字符编码 res.encoding = 'utf-8'
- text :字符串 网站源码
- content :字节流 字符串网站源码
- status_code :HTTP响应码
- url :实际数据的URL地址
import requests url = 'http://www.baidu.com/' # 爬取百度网页
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 \
(KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'} res = requests.get(url, headers=headers)
print(res.encoding) # 查看网站的编码格式 ISO-8859-1 # text属性获取响应内容(字符串)网站源码
res = requests.get(url,headers=headers)
res.encoding = 'utf-8'
html = res.text # content属性获取响应内容(字节串 bytes)网站源码
res = requests.get(url,headers=headers)
html = res.content.decode('utf-8') print(res.status_code) # 查看响应码 200
print(res.url) # 查看访问的URL地址 https://www.baidu.com/
非结构化数据的保存方式
像压缩文件zip、图片文件等都可以使用非结构化数据的保存方式
with open('xxx.jpg','wb') as f:
f.write(res.content)
示例:保存赵丽颖图片到本地
import requests url = 'http://dingyue.nosdn.127.net/lL1JH2YdpAWrzEhfp8BrJ8lTHa1602AEX9E7qpTpH5NzW1535203788506compressflag.jpg'
headers = {'User-Agent': 'Mozilla/5.0'} html = requests.get(url, headers=headers).content # 把图片保存到本地
with open('赵丽颖.jpg', 'wb') as f:
f.write(html)
百度贴吧图片抓取
目标:抓取指定贴吧所有图片
思路
- 获取贴吧主页URL,下一页,找到不同页的URL规律
- 获取1页中所有帖子URL地址: [帖子链接1,帖子链接2,...]
- 对每个帖子链接发请求,获取图片URL
- 向图片的URL发请求,以wb方式写入本地文件
贴吧URL规律:http://tieba.baidu.com/f?kw=??&pn=50
xpath表达式
1、帖子链接xpath,这里为什么属性选择class,因为相同的元素他们要相同的样式
//div[@class="t_con cleafix"]/div/div/div/a/@href
2、图片链接xpath
//div[@class="d_post_content j_d_post_content clearfix"]/img[@class="BDE_Image"]/@src
3、视频链接xpath
//div[@class="video_src_wrapper"]/embed/@data-video
# 注意: 此处视频链接前端对响应内容做了处理,需要查看网页源代码来查看,复制HTML代码在线格式化
百度贴吧视频抓取反爬机制(对响应内容做处理)
网页源代码是:
<div class="video_src_wrapper">
<embed data-video="http://tb-video.bdstatic.com/tieba-smallvideo-transcode-cae/2754153_8fcd225842344de9901c1489e49defbe_0_cae.mp4"
F12调试定位到的代码是:
<div class="video_src_wrapper">
<div class="video_src_wrap_main">
<video src="http://tb-video.bdstatic.com/tie-cae/f2358e8_0_cae.mp4" "></video>
</div>
</div>
如果通过F12定位的位置,写xpath,会爬取不到,因为我们requsets爬取的是网页代码,最后还是要以网页源代码为主。
import requests
from lxml import etree
import random
import time
from urllib import parse class BaiduImageSpider(object):
def __init__(self):
self.url = 'http://tieba.baidu.com/f?kw={}&pn={}'
self.ua_list = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET \
CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)', ] # 获取html网页代码
def get_html(self, url):
headers = {'User-Agent': random.choice(self.ua_list)}
html = requests.get(url=url, headers=headers).content.decode('utf-8', 'ignore')
return html # 解析html
def xpath_func(self, html, xpath_bds):
parse_html = etree.HTML(html)
r_list = parse_html.xpath(xpath_bds)
return r_list # 图片抓取
def parse_html(self, one_url):
html = self.get_html(one_url)
xpath_bds = '//div[@class="t_con cleafix"]/div/div/div/a/@href'
r_list = self.xpath_func(html, xpath_bds) # 提取帖子链接:xpath_list ['/p/32323','','']
for r in r_list:
t_url = 'http://tieba.baidu.com' + r # 拼接帖子的URL地址
self.get_image(t_url) # 把帖子中所有图片保存到本地
time.sleep(random.uniform(0, 2)) # 爬完1个帖子中所有图片,休眠0-2秒钟 # 给定1个帖子URL,把帖子中所有图片保存到本地
def get_image(self, t_url):
html = self.get_html(t_url) # 使用xpath表达式的或| : 图片链接 + 视频链接
xpath_bds = '//div[@class="d_post_content j_d_post_content clearfix"]/img[@class="BDE_Image"]/@src | //div[@class="video_src_wrapper"]/embed/@data-video'
img_list = self.xpath_func(html, xpath_bds) # ['http://xxx.jpg','']
print(img_list)
for img in img_list:
html_bytes = requests.get(url=img, headers={'User-Agent': random.choice(self.ua_list)}).content
self.save_img(html_bytes, img) # 保存图片函数
def save_img(self, html_bytes, img):
filename = img[-10:]
with open(filename, 'wb') as f:
f.write(html_bytes)
print('%s下载成功' % filename) # 主函数
def main(self):
name = input('请输入贴吧名:')
begin = int(input('请输入起始页:'))
end = int(input('请输入终止页:'))
# 对贴吧名进行编码
kw = parse.quote(name)
for page in range(begin, end + 1):
pn = (page - 1) * 50
url = self.url.format(kw, pn)
# 调用主线函数
self.parse_html(url) if __name__ == '__main__':
spider = BaiduImageSpider()
spider.main()
查询参数-params
res = requests.get(url,params=params,headers=headers)
url为基准的url地址,不包含查询参数,该方法会自动对params字典编码,然后和url拼接
参数类型:字典,字典中键值对作为查询参数
import requests baseurl = 'http://tieba.baidu.com/f?'
params = {
'kw': '赵丽颖吧',
'pn': ''}
headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2\
; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR \
3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)'}
# 自动对params进行编码,然后自动和url进行拼接,去发请求
res = requests.get(baseurl, headers=headers, params=params)
res.encoding = 'utf-8'
print(res.text)
Web客户端验证参数-auth
res = requests.get(url, headers=headers, auth=('username','password'))
针对于需要web客户端用户名密码认证的网站,auth = ('username','password')
达内课程笔记
import requests
from lxml import etree
import random
import os class CodeSpider(object):
def __init__(self):
self.url = 'http://code.tarena.com.cn/AIDCode/aid1904/14-redis/'
self.auth = ('tarenacode', 'code_2013')
self.ua_list = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .\
NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)', ] def parse_html(self):
# 获取响应内容
html = requests.get(url=self.url, headers={'User-Agent': random.choice(self.ua_list)}, auth=self.auth)
html = html.content.decode('utf-8', 'ignore') parse_html = etree.HTML(html) # 解析
r_list = parse_html.xpath('//a/@href') # # r_list : ['../','day01','day02','redis_day01.zip']
for r in r_list:
if r.endswith('.zip') or r.endswith('.rar'):
self.save_files(r) def save_files(self, r):
directory = '/home/tarena/AID/redis/'
if not os.path.exists(directory):
os.makedirs(directory) # 拼接地址,把zip文件保存到指定目录
url = self.url + r
# filename: /home/tarena/AID/redis/xxx.zip
filename = directory + r
html = requests.get(url=url, headers={'User-Agent': random.choice(self.ua_list)}, auth=self.auth).content with open(filename, 'wb') as f:
f.write(html)
print('%s下载成功' % r) if __name__ == '__main__':
spider = CodeSpider()
spider.parse_html()
SSL证书认证参数-verify
response = requests.get(url=url,params=params,headers=headers,verify=False)
SSL证书认证参适用于没有经过 证书认证机构认证的https类型网站,一般这种网站会抛出 SSLError 异常则考虑使用此参数
verify:True(默认)检查证书认证;False(常用)忽略证书认证
代理参数-proxies
定义:代替你原来的IP地址去对接网络的IP地址。隐藏自身真实IP,避免被封。
普通代理
获取代理IP网站:西刺代理、快代理、全网代理、代理精灵、... ...
语法结构
proxies = {'协议':'协议://IP:端口号'} # http和https是相同的
proxies = {
'http':'http://59.172.27.6:38380',
'https':'https://59.172.27.6:38380'
}
使用免费普通代理IP访问测试网站: http://httpbin.org/get
import requests url = 'http://httpbin.org/get'
headers = {'User-Agent': 'Mozilla/5.0'}
# 定义代理,在代理IP网站中查找免费代理IP
proxies = {
'http': 'http://309435365:szayclhp@43.226.164.156:16818',
'https': 'https://309435365:szayclhp@43.226.164.156:16818'}
html = requests.get(url, proxies=proxies, headers=headers, timeout=5).text
print(html)
IP池
从西刺代理上面爬取IP,迭代测试能否使用,建立一个自己的代理IP池,随时更新用来抓取网站数据
import requests
from lxml import etree
import time
import random
from fake_useragent import UserAgent class GetProxyIP(object):
def __init__(self):
self.url = 'https://www.xicidaili.com/nn/'
self.proxies = {
'http': 'http://163.204.247.219:9999',
'https': 'http://163.204.247.219:9999'} # 随机生成User-Agent
def get_random_ua(self):
ua = UserAgent() # 创建User-Agent对象
useragent = ua.random
return useragent # 从西刺代理网站上获取随机的代理IP
def get_ip_file(self, url):
headers = {'User-Agent': self.get_random_ua()}
# 访问西刺代理网站国内高匿代理,找到所有的tr节点对象
html = requests.get(url=url, proxies=self.proxies, headers=headers, timeout=5).content.decode('utf-8', 'ignore')
parse_html = etree.HTML(html)
# 基准xpath,匹配每个代理IP的节点对象列表
tr_list = parse_html.xpath('//tr')
for tr in tr_list[1:]:
ip = tr.xpath('./td[2]/text()')[0]
port = tr.xpath('./td[3]/text()')[0]
# 测试ip:port是否可用
self.test_proxy_ip(ip, port) # 测试抓取的代理IP是否可用
def test_proxy_ip(self, ip, port):
proxies = {
'http': 'http://{}:{}'.format(ip, port),
'https': 'https://{}:{}'.format(ip, port), }
test_url = 'http://www.baidu.com/'
try:
res = requests.get(url=test_url, proxies=proxies, timeout=8)
if res.status_code == 200:
print(ip, ":", port, 'Success')
with open('proxies.txt', 'a') as f:
f.write(ip + ':' + port + '\n')
except Exception as e:
print(ip, port, 'Failed') # 主函数
def main(self):
for i in range(1, 1001):
url = self.url.format(i)
self.get_ip_file(url)
time.sleep(random.randint(5, 10)) if __name__ == '__main__':
spider = GetProxyIP()
spider.main()
从IP池中取IP
从文件中随机获取代理IP写爬虫
import random
import requests class BaiduSpider(object):
def __init__(self):
self.url = 'http://www.baidu.com/'
self.headers = {'User-Agent': 'Mozilla/5.0'}
self.blag = 1 def get_proxies(self):
with open('proxies.txt', 'r') as f:
result = f.readlines() # 读取所有行并返回列表
proxy_ip = random.choice(result)[:-1] # 获取了所有代理IP
L = proxy_ip.split(':')
proxy_ip = {
'http': 'http://{}:{}'.format(L[0], L[1]),
'https': 'https://{}:{}'.format(L[0], L[1])
}
return proxy_ip def get_html(self):
proxies = self.get_proxies()
if self.blag <= 3:
try:
html = requests.get(url=self.url, proxies=proxies, headers=self.headers, timeout=5).text
print(html)
except Exception as e:
print('Retry')
self.blag += 1
self.get_html() if __name__ == '__main__':
spider = BaiduSpider()
spider.get_html()
收费代理API
写一个获取收费开放API代理的接口
# 获取开放代理的接口
import requests
from fake_useragent import UserAgent ua = UserAgent() # 创建User-Agent对象
useragent = ua.random
headers = {'User-Agent': useragent} def ip_test(ip):
url = 'http://www.baidu.com/'
ip_port = ip.split(':')
proxies = {
'http': 'http://{}:{}'.format(ip_port[0], ip_port[1]),
'https': 'https://{}:{}'.format(ip_port[0], ip_port[1]),
}
res = requests.get(url=url, headers=headers, proxies=proxies, timeout=5)
if res.status_code == 200:
return True
else:
return False # 提取代理IP
def get_ip_list():
# 快代理:https://www.kuaidaili.com/doc/product/dps/
api_url = 'http://dev.kdlapi.com/api/getproxy/?orderid=946562662041898&num=100&protocol=1&method=2&an_an=1&an_ha=1&sep=2'
html = requests.get(api_url).content.decode('utf-8', 'ignore')
ip_port_list = html.split('\n') for ip in ip_port_list:
with open('proxy_ip.txt', 'a') as f:
if ip_test(ip):
f.write(ip + '\n') if __name__ == '__main__':
get_ip_list()
私密代理
1、语法结构
proxies = {
'协议':'协议://用户名:密码@IP:端口号'
}
proxies = {
'http':'http://用户名:密码@IP:端口号',
'https':'https://用户名:密码@IP:端口号'
}
proxies = {
'http': 'http://309435365:szayclhp@106.75.71.140:16816',
'https':'https://309435365:szayclhp@106.75.71.140:16816',
}
用户名和密码会在给你API_URL的时候给你。不是你的账号和账号密码。
# 获取开放代理的接口
import requests
from fake_useragent import UserAgent ua = UserAgent() # 创建User-Agent对象
useragent = ua.random
headers = {'User-Agent': useragent} def ip_test(ip):
url = 'https://blog.csdn.net/qq_34218078/article/details/90901602/'
ip_port = ip.split(':')
proxies = {
'http': 'http://1786088386:b95djiha@{}:{}'.format(ip_port[0], ip_port[1]),
'https': 'http://1786088386:b95djiha@{}:{}'.format(ip_port[0], ip_port[1]),
} res = requests.get(url=url, headers=headers, proxies=proxies, timeout=5)
if res.status_code == 200:
print("OK")
return True
else:
print(res.status_code)
print("错误")
return False # 提取代理IP
def get_ip_list():
# 快代理:https://www.kuaidaili.com/doc/product/dps/
api_url = 'http://dps.kdlapi.com/api/getdps/?orderid=986603271748760&num=1000&signature=z4a5b2rpt062iejd6h7wvox16si0f7ct&pt=1&sep=2'
html = requests.get(api_url).content.decode('utf-8', 'ignore')
ip_port_list = html.split('\n') for ip in ip_port_list:
with open('proxy_ip.txt', 'a') as f:
if ip_test(ip):
f.write(ip + '\n') if __name__ == '__main__':
get_ip_list()
requests.get爬虫模块参数的更多相关文章
- 爬虫模块之requests模块
一 模块的下载安装 pip install requests 二 爬虫的介绍 什么是爬虫:就是模拟浏览器发送请求:保存到本地:提取有用的数据:保存到数据库 爬虫的价值:获取有用的数据,保存到数据库 爬 ...
- python 跨语言数据交互、json、pickle(序列化)、urllib、requests(爬虫模块)、XML。
Python中用于序列化的两个模块 json 用于[字符串]和 [python基本数据类型] 间进行转换 pickle 用于[python特有的类型] 和 [python基本数据类型]间进 ...
- python爬虫---单线程+多任务的异步协程,selenium爬虫模块的使用
python爬虫---单线程+多任务的异步协程,selenium爬虫模块的使用 一丶单线程+多任务的异步协程 特殊函数 # 如果一个函数的定义被async修饰后,则该函数就是一个特殊的函数 async ...
- 爬虫模块BeautifulSoup
中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html# 1.1 安装BeautifulSoup模块 ...
- insmod module_param 模块参数
模块参数 引导模块时,可以向它传递参数.要使用模块参数加载模块,这样写: insmod module.ko [param1=value param2=value ...] 为了使用这些参数的值,要在模 ...
- Verilog 模块参数重定义(转)
Verilog重载模块参数: 当一个模块引用另外一个模块时,高层模块可以改变低层模块用parameter定义的参数值,改变低层模块的参数值可采用以下两种方式: 1)defparam 重定义参数语法:d ...
- http proxy模块参数
http proxy模块参数 nginx功能的代理功能是是通过http proxy模块来实现的.默认在安装Nginx是已经安装了http proxy模块,可以直接使用. http模块相关参数 说明 p ...
- requests(第三方模块) 请求、登录、下载网页
import requests #http://docs.python-requests.org/en/latest/api/ 说明文档 ''' requests.request(method,ur ...
- 模块参数,系统调用,字符设备编程重要数据结构,设备号的申请与注册,关于cdev的API
1.模块参数 应用编程: int main(int argc, char *argv[]) { } ./a.out xxx yyy zzz ...
随机推荐
- 动手造轮子:基于 Redis 实现 EventBus
动手造轮子:基于 Redis 实现 EventBus Intro 上次我们造了一个简单的基于内存的 EventBus,但是如果要跨系统的话就不合适了,所以有了这篇基于 Redis 的 EventBus ...
- spring中获取容器中的Bean为什么前转成接口而不是实现类
简单介绍一下上下文,userService是服务层接口有一个save方法,userServiceImpl是该接口的实现类重写了save方法. applicationContext.xml如图: 后台代 ...
- 抓取崩溃的log日志
1.下载adb工具包 也就是解锁软件,如果要解锁的话,需确认有fastboot 安装jdk.sdk 2.注意事项 请确保电脑上只连接了一台手机设备(最好只连接一条USB线),同时确保手机已开启USB调 ...
- word 文档导出 (freemaker+jacob)--java开发
工作中终于遇到了 需要导出word文旦的需求了.由于以前没有操作过,所以就先百度下了,基本上是:博客园,简书,CDSN,这几大机构的相关帖子比较多,然后花了2周时间 才初步弄懂. 学习顺序: 第一阶 ...
- CentOS7 安装 单机 Mysql
1.解压文件 [root@centos3 ~]# tar -zxvf mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ 2.重命名 [ ...
- java常见面试题目(一)
在大四实习阶段,秋招的时候,面试了很多家公司,总结常见的java面试题目:(答案可以自己百度) 1.你所用oracle的版本号是多少? 2.tomcat修改8080端口号的配置文件是哪个? 3.myb ...
- [ubuntu][deepin]系统增加自定义开机启动项
[ubuntu][deepin]系统增加自定义开机启动项 进行配置 cd /etc/init.d/ ls vim myScript nginx实例 #! /bin/sh # chkconfig: # ...
- 【POJ - 2431】Expedition(优先队列)
Expedition 直接中文 Descriptions 一群奶牛抓起一辆卡车,冒险进入丛林深处的探险队.作为相当差的司机,不幸的是,奶牛设法跑过一块岩石并刺破卡车的油箱.卡车现在每运行一个单位的距离 ...
- Python递归函数,二分查找算法
目录 一.初始递归 二.递归示例讲解 二分查找算法 一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但 ...
- VS调试时修改代码
最近碰到一个问题,就是vs在调试模式下无法修改代码之后再继续,这种严重影响工作效率的问题怎么能忍,所以决心把这个坑填满.网上搜了大堆有头无尾有尾无头的答案,我一个一个试了几乎都没啥用.最后通过不断的测 ...