requests爬虫
通过正则表达式爬取https://movie.douban.com/top250电影网站的电影标题,将该网站所有的h2标签内的内容(标题)提取出来。
import re
import requests
r = requests.get('https://movie.douban.com/top250')
pattern = re.compile('<a.*?>(.*?)</a>',re.S)
title = re.findall(pattern,r.text)
print(title)
爬取一个网站的小图标
就是在一个网址后面加上/favicon.ico。将爬取出来的小图标在文件中以二进制的形式写入。
r = requests.get('https://movie.douban.com/top250/favicon.ico')
# wb:把图片以二进制的形式写入
with open('favicon.ico', 'wb') as f:
f.write(r.content)
以二进制的方式打开之前插入的图片,在https://httpbin**.org/该网站会判断如果客户端发起的是 GET 请求的话,它返回相应的请求信息。然后将读取的信息以字典的形式填入信息。
f = {'file':open('favicon.ico','rb')}
r = requests.post('https://movie.douban.com/top250/post',files=f)
print(r.text)
这里爬取一下github:
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
'Cookie':'_octo=GH1.1.199807212.1657939903; logged_in=yes; dotcom_user=minetobe; color_mode={"color_mode":"auto","light_theme":{"name":"light","color_mode":"light"},"dark_theme":{"name":"dark","color_mode":"dark"}}; preferred_color_mode=light; tz=Asia/Shanghai'
}
r = requests.get('https://github.com/',headers=header)
print(r.text)
获取cookie值
获取自己设置的cookie值:
s = requests.Session()
s.get('https://movie.douban.com/top250/cookies/set/number/123456')
r = s.get('https://movie.douban.com/top250/cookies')
print(r.text)
爬虫越过网站警告方式
有些网站的SSL证书过期了或者没被CA机构认可就会出现警告报错,我们爬取该网站的时候就会报443.那我们就需要忽视或者跳过这个警告。
忽略警告方法一:
由于访问时会报警告,使用urllib3
import requests
from requests.packages import urllib3
urllib3.disable_warnings()
response = requests.get('https://movie.douban.com/top250',verify=False)
print(response.status_code)
忽略警告方法二:
通过捕捉警告到日志的方式忽略警告
import logging
logging.captureWarnings(True)
requests = requests.get('https://movie.douban.com/top250',verify=False)
print(requests.status_code)
设置超时响应,防止服务器报错直接退出得莫名其妙,或者要响应很久浪费时间
这里可以设置一个响应时间(单位是s),如果超过这个时间就会抛出异常。
import requests
r = requests.get('https://movie.douban.com/top250', timeout=1)
print(r.status_code)
请求时间分为的是两个阶段(连接和读取)上面那种是直接统计这两个阶段的时间,也可以用元组分开来指定。
import requests
r = requests.get('https://movie.douban.com/top250', timeout=(5, 30))
print(r.status_code)
也可以永久等待,也就是不设置timeout的参数,或者把参数改为None
请求需要登录验证的网页
可以直接通过auth参数可以在其中输入对应的账号密码自动登录爬取(通过元组)。
r = requests.get('https://movie.douban.com/top250',auth=('admin','admin'))
print(r.status_code)
还可以从requests.auth中引入HTTPBasicAuth模块(其实就是加个HTTPBasicAuth):
r = requests.get('https://movie.douban.com/top250',auth=HTTPBasicAuth('admin','admin'))
print(r.status_code)
不用get方法来获取信息
其实用get方法发送请求是在内部自动构造Requests对象,赋予url,data,headers的参数。这里直接构造这三个的参数,不使用get或者post发送请求。
from requests import Request, Session
URL = 'https://movie.douban.com/top250/post'
data = {'name': 'germey'}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
# 调用Session的preparee_request方法将Request对象转换为Prepared Request对象,调用send方法发送。
s = Session()
req = Request('POST', URL, data=data, headers=headers)
prepped = s.prepare_request(req)
r = s.send(prepped)
print(r.text)
还有个设置代理IP,来防止我们大规模爬取数据时网站直接封我们的IP
具体实施不知道出了什么问题我暂时还没搞出来,下来我自己研究一下。