您的当前位置:首页正文

爬虫模块介绍--request(发送请求模块)

2020-07-15 来源:步旅网
爬⾍模块介绍--request(发送请求模块)

爬⾍:可见即可爬 # 每个⽹站都有爬⾍协议

基础爬⾍需要使⽤到的三个模块requests 模块 # 模拟发请求的模块

PS:python原来有两个模块urllib和urllib的升级urllib2,这两个模块使⽤很繁琐,后来在这两个模块上做了封装就出现了requests模块beautifulsoup 模块 #数据解析库,re模块正则匹配解析库senium 模块 # 控制浏览器模块

scrapy 模块 # 把上⾯三个模块进⾏⼀个封装,做成⼀个⼤框架,可以做分布式爬⾍

requests的基本使⽤ # 使⽤ pip3 install requestsrequests.get请求

requests.get⽅法就是帮你凑出⼀个http请求发送有三个参数

url : 就是访问的地址headers: 请求头

params : 输⼊的内容和页码

响应response的参数

response.text ⽂本内容 # ⽂本内容取值

response.content ⼆进制内容 # 如果是图⽚和视频就要⽤这个⽅法取值

rsponse.iter_content() # 如果⼀个视频或者图⽚⽂件⾮常⼤,如果⼀次性取值就会撑爆内存,所以要⽤这个iter_content,相当于for循环接收保存response.status_code 状态码 # ⽤来获取状态码response.headers 响应头 # 以字典形式response.cookies 返回的cookie

response.cookies.get_dict() 把取到的cookie转成字典形式response.cookies.items() 和字典的items同理response.url 拿出要重定向的地址

response.history 拿出正常返回的数据 # 和text相同response.encoding 返回数据的编码格式

response.apparent_encoding # 获取当前页码的编码格式

PS:现在⽹站都有反扒技术,所以在模拟发送请求的时候尽量的要模拟的像浏览器⼀样,否则容易被反扒技术拦截,就算返回200状态码,也是⽹站返回的假状态码

Request Headers # 这些是请求头的内容,这个直接从浏览器⾥⾯复制即可

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding:gzip, deflate, brAccept-Language:zh-CN,zh;q=0.9Cache-Control:max-age=0Connection:keep-alive

Referer:https://www.lagou.com/ # 有些⽹站的请求头⾥⾯会有这⼀⾏⽤来判断是不是当前域,这个作⽤就是⽤来统计流量从哪⼀个⽹站跳转过来的,也可以实现反扒,就是所有的跳转地址都要在程序设定的地址跳转过来,图⽚防盗链也是⽤这个实现

'''正常的cookie写在请求头中,但是因为要经常⽤,所有requests模块把这个单独拿出来做了处理,请求头中最有⽤的⼀个参数就是user_session,当然也可以把整个cookie复制过来'''

Cookie:BAIDUID=8472CC0AF18E17091C3918C619E26E6D:FG=1; BIDUPSID=8472CC0AF18E17091C3918C619E26E6D; PSTM=1553224384; BD_UPN=1a314353;BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_645EC=d40c8VmPu6D48Clciaof7nl3ZoeWgKbduZIrfnNW%2FgKxKTRWYmN4scXUrJA; delPer=0;BD_HOME=0; H_PS_PSSID=1462_21120_28771_28721_28557_28833_28585_28640_26350_28604Host:www.baidu.com # 可以⽤来判断是不是当前的域,这个⽤的少Upgrade-Insecure-Requests:1

User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400QQBrowser/10.3.3127.400 # 这个是浏览器类型,包含浏览器的信息,⼀般在发送请求的时候都要携带这个PS:在爬⾍的时候⼀直失败,肯定是模拟的不够像浏览器,所以⽤浏览器访问⼀次⽹站,查看下请求头的内容

request的基本使⽤和get请求实例

import requests # 爬⾍需要⽤到的模块,模拟发送请求'''requests的基本使⽤'''

# 输⼊中⽂和特殊字符需要编码

# 如果 查询关键词是中⽂或者是其他特殊符号,则不的不进⾏url编码,否则会乱码 'https://www.baidu.com/s?wd=%E8%A5%BF%E7%93%9C'这⾥地址内的乱码符号就是被转码后的中⽂或者特殊字符# 可以from urllib.parse import urlencode #使⽤这个模块对输⼊的中⽂或特殊字符进⾏编码,但是requests⾃带了⼀个参数,param可以实现编码并且⾃动拼接到地址的后⾯

key = input('请输⼊需要的内容: ')# 发送get请求有返回结果url = 'https://www.baidu.com'

# 正常的cookie写在请求头中,但是因为要经常⽤,所有requests模块把这个单独拿出来做了处理cookies = {'user_session':'BAIDUID=8472CC0AF18E17091C3918C619E26E6D:FG=1; BIDUPSI'}

# 反扒信息之⼀,要携带头信息的浏览器信息res = requests.get(url, headers={

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400'}, # baidu的页码规律是0=1,10=2的⼀个10倍数的跳转,所以params⾥⾯也可以拼地址进去直接跳转到指定的页数,就是get形式携带的参数 params={'wd': key, 'pn': 70}, cookies=cookies )

# 这⾥将获取到的页⾯内容写⼊⽂件,⽤来验证是否成功with open('a.html', 'w', encoding='utf-8')as f: f.write(res.text)

# 请求回来的内容,text是整个页⾯的内容print(res.text)# 请求回来的状态码print(res.status_code)

request的基本使⽤和post请求实例

post请求参数 # 和get请求类似param # 输⼊的内容和页码headers # 请求头Cookie # cookie

data # 请求体的数据,默认⽤urlencode格式

json # 传字典,这样发送的请求编码格式是 'content-type':'application/json'

allow_redirects=False # 是否允许重定向,不写就是默认True,通常不会关闭后续操作可能会出问题PS:先⽤错误的账号密码登陆,就可以在检查⾥看到请求发送的地址以及请求发送的数据格式 # 看图

import requests, re

# 第⼀步

res_login = requests.get('https://github.com/login') # 访问页⾯获得返回数据

authenticity_token = re.findall(r'name=\"authenticity_token\".*?value=\"(.*?)\"',res_login.text,re.S)[0] # .*?正则表达式贪婪匹配,()是分组匹配,取出来的是⼀个列表,取索引位0的数据,re.S把字符串看成⼀⾏忽略字符串中的换⾏符login_cookie = res_login.cookies.get_dict() # 这⾥获取⼀个没有经过认证的cookie# 第⼆步data = {

'commit': 'Sign in', 'utf8': '✓',

'authenticity_token': authenticity_token, 'login': 'Dragon-Killing', 'password': 'Dk581588',

'webauthn-support': 'unsupported',

} # 这个就是⽹页⾥⾯Form Data携带的数据,就是请求体的数据

res = requests.post(url='https://github.com/session', data=data,

# 这⾥也需要携带⼀个未认证的cookie,现在很多⽹站都在⾸次登陆时候都要求携带未认证的cookie,这也是⼀种反扒⼿段 cookies=login_cookie)

# 正常登陆成功,返回cookie,下次发送请求携带者cookie

res_cookie = res.cookies.get_dict() #res是⼀个对象,从对象中获取cookie,然后转成字典# 第三步

url='https://github.com/settings/emails'res = requests.get(url,

headers={

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400'}, # baidu的页码规律是0=1,10=2的⼀个10倍数的跳转,所以params⾥⾯也可以拼地址进去直接跳转到指定的页数,就是get形式携带的参数 cookies=res_cookie )

print('邮箱号' in res.text) # 这⾥判断邮箱是否在返回的数据中,成功就是True

requests模块中的session⽅法 # 返回⼀个对象,⽤这个⽅法发送get和post请求,只要⽹站返回的cookie,则发送请求的时候⾃动携带cookis,不⽤再⼿动获取然后再写⼊

import requestsimport re

session = requests.session()

# 第⼀次发送请求

r1 = session.get('https://github.com/login')

authenticity_token = re.findall(r'name=\"authenticity_token\".*?value=\"(.*?)\"',r1.text)[0] #从页⾯中拿到CSRT_TOKENprint(authenticity_token)

#第⼆次请求data = {

'commit': 'Sign in', 'utf8': '✓',

'authenticity_token': authenticity_token, 'login': 'Dragon-Killing', 'password': 'Dk581588',}

r2=session.post('https://github.com/session',data=data)#第三次请求

r3=session.get('https://github.com/settings/emails')print('402821597@qq.com' in r3.text)

前端往后台发送数据,有三种⽅式

1、urlencode # data发送数据就是默认这个格式2、formdate # 传⽂件的编码

3、json # 如果后端要求发送的是json格式,就⽤这个格式

requests.post (url='http://xxx.com',data={'xxx':'yyy'}) # 如果没有指定请求头,则默认的请求头就是:application/x-www-form-urlencoed# 如果定义的请求头是application/json,并且⽤data传值,则服务端取不到值

requests.post(url='',data={'xxx':'xxx'},headers={'content-type':'appilcation/json'}) # 这⾥⽤data传值,但是指定了json请求头,所以服务端取不到数据request.post(url='',json={'xxx':1}) # 这⾥⽤json传值,但是没有指定请求头,则默认根据传值的类型匹配请求头,这⾥就是默认是application/json格式请求头

如果在爬去页⾯的时候发⽣乱码,则肯定是编码问题,通过下⾯实例的⽅式解决编码的问题

import requests

response = requests.get('http://www.autohome.com/news')ret = response.apparent_encoding # 获取当前页码的编码格式response.encoding=ret # 指定解码的格式print(response.text)

对于图⽚和视频的爬取保存,必须是⼆进制形式保存,所以要⽤content获取⼆进制流保存

import requests

response = requests.get('https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2602558426,100251765&fm=26&gp=0.jpg')with open('a.jpg','wb')as f: f.write(response.content)

对于很⼤的视频⽂件,⼀次性取值则肯定很耗费内存,则⽤iter_content⽐较合适

import requests

# 这⾥发请求的时候⼀定要跟⼀个stream=True

response = requests.get('https://gs33.baidu.com/eer7rer7e878df7d8f7d8f.mp4',stream=True)# 这样就迭代的⼀⾏⼀⾏取值,⽤来爬视频with open('a.mp4','wb')as f:

for line in response.iter_content(): f.write(line)

解析json格式的数据

import requests,json

response = requests.get('http://httpbin.org/get') #加⼊这⾥返回的格式是json格式

# res = json.loads(response.text) ⽤内置的⽅法去转换则要异步

res = response.json() # resquests实例化对象后可以直接获取json数据,就是封装了json的⽅法,直接转成数据原有的格式

requests模块的⾼级⽤法

 SSL Cert Verification 以前⼤部分⽹站都要验证证书,需要⽤到这个参数

#证书验证(⼤部分⽹站都是https)import requests

respone=requests.get('https://www.12306.cn') #如果是ssl请求,⾸先检查证书是否合法,不合法则报错,程序终端

#改进1:去掉报错,但是会报警告import requests

respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200print(respone.status_code)

#改进2:去掉报错,并且去掉警报信息import requests

from requests.packages import urllib3urllib3.disable_warnings() #关闭警告

respone=requests.get('https://www.12306.cn',verify=False)print(respone.status_code)

#改进3:加上证书

#很多⽹站都是https,但是不⽤证书也可以访问,⼤多数情况都是可以携带也可以不携带证书#知乎\\百度等都是可带可不带

#有硬性要求的,则必须带,⽐如对于定向的⽤户,拿到证书后才有权限访问某个特定⽹站import requests

respone=requests.get('https://www.12306.cn',

cert=('/path/server.crt', # 这⾥是证书本地地址 '/path/key'))print(respone.status_code)

使⽤ip代理

#代理设置:先发送请求给代理,然后由代理帮忙发送(封ip是常见的事情)import requestsproxies={

'http':'http://egon:123@localhost:9743',# 带⽤户名密码的代理,@符号前是⽤户名与密码 'http':'http://localhost:9743', 'https':'https://localhost:9743',}

respone=requests.get('https://www.12306.cn',

proxies=proxies) # 这个参数就是⽤代理发送print(respone.status_code)

#⽀持socks代理,安装:pip install requests[socks]import requestsproxies = {

'http': 'socks5://user:pass@host:port', 'https': 'socks5://user:pass@host:port'}

respone=requests.get('https://www.12306.cn', proxies=proxies)print(respone.status_code)

超时设置 # 在发送请求的时候如果时间过长没有收到回复,则要设置超时时间,否则程序会⼀直等待

# 两种超时:float or tuple

#timeout=0.1 # 代表接收数据的超时时间

#timeout=(0.1,0.2)#0.1代表链接超时 0.2代表接收数据的超时时间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('a.jpg','rb')}

respone=requests.post('http://httpbin.org/post',files=files)print(respone.status_code)

项⽬实例 (单线程爬取梨视频)

import requests,re

'''通⽤通过地址获取页⾯的⽅法'''def get_page(url):

ret = requests.get(url)

if ret.status_code == 200: # 使⽤status_code获取页⾯数据内的连接状态,通过判断返回码执⾏程序 return ret.text # 返回码200就是成功则将所有页⾯信息全部返回

'''这个⽤来解析地址'''def parse_res(text):

# 使⽤正则匹配匹配出上⾯的标签中需要的字符串,urls是⼀个列表,就是匹配到的视频名称 urls = re.findall(r'class=\"categoryem\".*?href=\"(.*?)\"',text,re.S) for url in urls:

# 循环获取到的视频名字列表列表

# 使⽤⽣成器拼接地址,只有for循环时候才会往下读⼀条,并且返回已读取的数据 yield 'https://www.pearvideo.com/' + url

def parse_detail(text): print(text)

# 这⾥⽤分组匹配,因为传⼊的是整个的页⾯地址,从页⾯中获取真实的数据地址 movie_url = re.findall('srcUrl=\"(.*?)\"',text,re.S)[0] print('视频⽂件的实际地址: ',movie_url) return movie_url

def download_movie(url): import time

movie_content = requests.get(url)

with open(r'e:\\\\%s%s'%(str(time.time()),'.mp4'),'wb')as f: f.write(movie_content.content)

if __name__ == '__main__':

# 这⾥向页⾯发送get请求,获得返回信息

res = get_page('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=13') urls = parse_res(res) # 这⾥将返回信息传给地址解析的函数,并且获得返回值 for url in urls:

try: # ⼀定要异常捕获,因为可能数据内⼀部分是空的,如果不捕获程序则直接奔溃

res_detail = get_page(url) # 这⾥for循环parse_res的返回值就是⼀个视频的地址传给get_page,再次访问获得页⾯数据 movie_url = parse_detail(res_detail) # 这⾥将视频的数据传⼊,然后通过分组获取真实的地址返回给函数 download_movie(movie_url) # 将真实的下载地址传给保存函数进⾏下载 except Exception as e: print(e)

项⽬实例 (多线程爬取梨视频)

import requests,re

from concurrent.futures import ThreadPoolExecutor # 线程池模块# ⽣成⼀个60个线程的线程池

pool = ThreadPoolExecutor(60) # 实例化线程池传⼊数字就是多少个线程

'''通⽤通过地址获取页⾯的⽅法'''def get_page(url):

ret = requests.get(url)

if ret.status_code == 200: # 使⽤status_code获取页⾯数据内的连接状态,通过判断返回码执⾏程序 return ret.text # 返回码200就是成功则将所有页⾯信息全部返回

'''这个⽤来解析地址'''def parse_res(text):

# add_done_callback不会直接将上个函数的返回结果传递进来,所以要⽤text.result()取得上个函数的返回结果 text = text.result()

#使⽤正则匹配匹配出上⾯的标签中需要的字符串,urls是⼀个列表,就是匹配到的视频名称 urls = re.findall(r'class=\"categoryem\".*?href=\"(.*?)\"',text,re.S) for url in urls:

pool.submit(get_page,'https://www.pearvideo.com/' + url).add_done_callback(parse_detail)

def parse_detail(text):

# add_done_callback不会直接将上个函数的返回结果传递进来,所以要⽤text.result()取得上个函数的返回结果 text = text.result()

# 这⾥⽤分组匹配,因为传⼊的是整个的页⾯地址,从页⾯中获取真实的数据地址 movie_url = re.findall('srcUrl=\"(.*?)\"',text,re.S)[0] print('真实的视频下载地址: ',movie_url) pool.submit(download_movie,movie_url)

def download_movie(url): import time

movie_content = requests.get(url)

with open(r'e:\\\\%s%s'%(str(time.time()),'.mp4'),'wb')as f: f.write(movie_content.content)

if __name__ == '__main__':

for i in range(5): # 这⾥range⽤来规定页数的数字 # 开始页是0

url = 'https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=%s'%(i*12+1)

# 得到地址的f放⼊线程池,add_done_callback()当该线程执⾏完成后执⾏的⽅法这⾥不⽤传参数会默认将前⾯执⾏的结果当参数传⼊ pool.submit(get_page,url).add_done_callback(parse_res) # 将要执⾏的⽅法和参数传⼊,⽅法不要加()

beautifulsoup 模块实例 #数据解析库,re模块正则匹配解析库如果复杂的⽹站⽤正则⾮常⿇烦,所以有bs4模块可以代替正则安装: pip3 install Beautifulsoup4项⽬实例 (爬取汽车之家的新闻)

import requests,time

from bs4 import BeautifulSoup

for i in range(1,10):

url = 'https://www.autohome.com.cn/news/%s/#liststart'%i ret = requests.get(url)

print(ret.status_code) # 查看返回状态 200

# 把页⾯返回的所有信息放到了对象中并且指定解析库进⾏实例化 soup = BeautifulSoup(ret.text,'lxml')

# find找出页⾯指定条件最近的⼀个,name就是指定的字符,attrs标签的属性,可以写class也可以写id,class(id):名 ul = soup.find(name='ul',attrs={'class':'article'})

# 上⾯把整个页⾯中的ul已经获取到,在ul中继续再往下找,这个写法就是找到所有ul下条件为li的元素放⼊列表中 li_s = ul.find_all(name='li') # for循环获取到的所有li元素 for li in li_s: try:

# 每次循环取a标签的herf的值,取到新闻的链接地址 news_url ='http:'+ li.find(name='a').get('href') # 取出新闻的标题

news_title = li.find(name='h3').text

# 取出新闻的简介⽂本,如果li下有多个p标签,则需要⽤findall取出所有的p标签 news_desc = li.find(name='p').text # 取出新闻的图⽚链接

news_img = 'http:' + li.find(name='img').get('src') print( '''

新闻标题:%s 新闻摘要:%s 新闻地址:%s 新闻图⽚地址:%s

'''%(news_title,news_desc,news_url,news_img) )

# 下载新闻的图⽚

respons = requests.get(news_img)

with open('img/%s.jpg'%str(time.time()),'wb')as f: f.write(respons.content) except Exception as e: print(e)

项⽬实例 (抽屉⽹⾃动点赞)

失败案例

import requests

'''模拟登陆,抽屉⽹登陆成功是9999,不同的⽹站登陆状态码不同'''ret = requests.post('https://dig.chouti.com/login',

headers={'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400'}, data={'phone': 8615618935321, 'password': 'Seep58158',

'oneMonth': 1}) # ⼀个⽉⾃动登录,1就是True,0就是False# 登陆成功取出cookies

cookie = ret.cookies.get_dict()

# 给⽂章点赞,向https://dig.chouti.com/link/vote?linksId=25703491发送post请求res = requests.post('https://dig.chouti.com/link/vote?linksId=25703491',

headers={'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400'}, cookies=cookie)

PS:这样登陆虽然返回状态码是9999,表⽰登陆成功,但是点赞是失败的,返回的9999是反扒技术返回的假信息

登陆并点赞成功案例

import requests

# 打开抽屉⾸页

ret = requests.get('https://dig.chouti.com/', headers={

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400' })

# ⽹站登陆时候会携带⼀个⾸页的cookies⽤来做反扒验证,所以这⾥从⾸页获取cookie_first = ret.cookies.get_dict()

# 模拟登陆

ret = requests.post('https://dig.chouti.com/login', headers={

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400'}, data={'phone': 8615618935321, 'password': 'Seep58158',

'oneMonth': 1},# ⼀个⽉⾃动登录,1就是True,0就是False cookies = cookie_first )

# cookie = ret.cookies.get_dict() 正常的思维是拿着登陆后的cookie去访问⽹站,但是这个抽屉⽹是⽤⾸页未登陆的cookie去验证全⽹,所以⽤登陆后的cookie是⽆效的# 这⾥点赞成功

res = requests.post('https://dig.chouti.com/link/vote?linksId=25703491',

headers={'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400'}, cookies=cookie_first)print(res.text)

使⽤bs4模块实现查找数据进⾏⾃动点赞和取消点赞

import requests

from bs4 import BeautifulSoup# 打开抽屉⾸页

ret = requests.get('https://dig.chouti.com/', headers={

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400' })

# ⽹站登陆时候会携带⼀个⾸页的cookies⽤来做反扒验证,所以这⾥从⾸页获取cookie_first = ret.cookies.get_dict()

# 模拟登陆

ret = requests.post('https://dig.chouti.com/login', headers={

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400'}, data={'phone': 8615618935321, 'password': 'Seep58158',

'oneMonth': 1},# ⼀个⽉⾃动登录,1就是True,0就是False cookies = cookie_first )

# 登陆成功再次进⼊⾸页,⽤bs4模块匹配出⽂章id进⾏点赞s = {}s = set(s)

for i in range(1,3):

rex = requests.get('https://dig.chouti.com/all/hot/recent/%s'%i, headers={

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400' })

soup = BeautifulSoup(rex.text,'lxml')

# ⽤bs4模块找到总的标签,find是最近的⼀个

div_all = soup.find(name='div',attrs={'class':'content-list','id':'content-list'})

# 然后⽤bs4模块在上⾯找到数据⾥⾯做指定元素匹配div标签,findall的结果是以列表形式 div_list = div_all.find_all(name='div') for div in div_list: try:

# 循环到的值在进⾏就近匹配指定类名的标签

div_id = div.find(name='a',attrs={'class':'pinglun close-comt'}) # 如果匹配到 if div_id:

# 则取⾥⾯的lang元素的值,这个值就是⽂章的id article_id = div_id.get('lang')

# 上⾯的数据有重复所以放⼊集合去重 s.add(article_id) except Exception as e: print(e) for s1 in s:

# 取到⽂章id动态传⼊post请求的地址,进⾏点赞

res = requests.post('https://dig.chouti.com/link/vote?linksId=%s'%s1, headers={

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400'}, cookies=cookie_first) # 这⾥是返回点赞的信息 print(res.text)

# 这⾥是取消点赞,⼿动取消

ret = requests.post('https://dig.chouti.com/vote/cancel/vote.do', headers={

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400'}, data={'linksId':'25701656'}, # 这个⽹站就是想vote.do发送这个字段做点赞去掉 cookies = cookie_first )

# 返回的取消点赞信息print(ret.text)

使⽤bs4模块实现⾃动评论

import requests

from bs4 import BeautifulSoup

# 打开抽屉⾸页

ret = requests.get('https://dig.chouti.com/', headers={

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400' })

# ⽹站登陆时候会携带⼀个⾸页的cookies⽤来做反扒验证,所以这⾥从⾸页获取cookie_first = ret.cookies.get_dict()

# 模拟登陆

ret = requests.post('https://dig.chouti.com/login', headers={

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400'}, data={'phone': 8615618935321, 'password': 'Seep58158',

'oneMonth': 1}, # ⼀个⽉⾃动登录,1就是True,0就是False cookies=cookie_first )

# ⾃动评论

rep = requests.post('https://dig.chouti.com/comments/create', headers={

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400'}, cookies=cookie_first,

            # data ⾥的参数先取⽹站做⼀个评论,看⼀下⽹站评论发送的地址和数据格式,拷贝过来即可 data={

'jid': 'cdu_55547782293', 'linkId': '25705361', 'isAssent': '',

'content': '这个⼩说好看吗', 'sortType': 'score', } )# 查看评论的结果print(rep.text)

因篇幅问题不能全部显示,请点此查看更多更全内容