爬虫 5 带cookies的requests.post请求
import requests #引入requests。 url = ' https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php' #把请求登录的网址赋值给url。 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36' } #加请求头,前面有说过加请求头是为了模拟浏览器正常的访问,避免被反爬虫。 data = { 'log': 'spiderman', #写入账户 'pwd': 'crawler334566', #写入密码 'wp-submit': '登录', 'redirect_to': 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn', 'testcookie': '1' } #把有关登录的参数封装成字典,赋值给data。 login_in = requests.post(url,headers=headers,data=data) #用requests.post发起请求,放入参数:请求登录的网址、请求头和登录参数,然后赋值给login_in。 cookies = login_in.cookies #提取cookies的方法:调用requests对象(login_in)的cookies属性获得登录的cookies,并赋值给变量cookies。 url_1 = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-comments-post.php' #我们想要评论的文章网址。 data_1 = { 'comment': input('请输入你想要发表的评论:'), 'submit': '发表评论', 'comment_post_ID': '13', 'comment_parent': '0' } #把有关评论的参数封装成字典。 comment = requests.post(url_1,headers=headers,data=data_1,cookies=cookies) #用requests.post发起发表评论的请求,放入参数:文章网址、headers、评论参数、cookies参数,赋值给comment。 #调用cookies的方法就是在post请求中传入cookies=cookies的参数。 print(comment.status_code) #打印出comment的状态码,若状态码等于200,则证明我们评论成功。
批量发布评论测试
import requests from bs4 import BeautifulSoup #引入requests。 url = ' https://g.lvovl.cn/wp-login.php' # 我们想要评论的文章网址。 res = requests.get('https://g.lvovl.cn') html = BeautifulSoup(res.text, 'html.parser') articleList = html.find_all('article', class_='article-list-1') url_1 = 'https://g.lvovl.cn/wp-comments-post.php' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36' } #加请求头,前面有说过加请求头是为了模拟浏览器正常的访问,避免被反爬虫。 data = { 'log': 'gavin', #写入账户 'pwd': '4321432143214312', #写入密码 'wp-submit': '登录', 'redirect_to': 'https://g.lvovl.cn', 'testcookie': '1' } #把有关登录的参数封装成字典,赋值给data。 login_in = requests.post(url,headers=headers,data=data) #用requests.post发起请求,放入参数:请求登录的网址、请求头和登录参数,然后赋值给login_in。 cookies = login_in.cookies #提取cookies的方法:调用requests对象(login_in)的cookies属性获得登录的cookies,并赋值给变量cookies。 # 我们想要评论的文章网址。 for href in articleList: href2 = href.find('a')['href'] print(href2) res2 = requests.get(href2) html2 = BeautifulSoup(res2.text, 'html.parser') postId = html2.find(attrs={'name':'comment_post_ID'}) print(postId['value']) data_1 = { 'comment': '爬虫批量发布评论测试', 'submit': '发表评论', 'comment_post_ID': postId['value'], 'comment_parent': '0' } # 把有关评论的参数封装成字典。 comment = requests.post(url_1, headers=headers, data=data_1, cookies=cookies) # 用requests.post发起发表评论的请求,放入参数:文章网址、headers、评论参数、cookies参数,赋值给comment。 # 调用cookies的方法就是在post请求中传入cookies=cookies的参数。 print(comment.status_code) # 打印出comment的状态码,若状态码等于200,则证明我们评论成功。
把cookies保存到本地的操作
import requests,json session = requests.session() #创建会话。 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36' } #添加请求头,避免被反爬虫。 try: #如果能读取到cookies文件,执行以下代码,跳过except的代码,不用登录就能发表评论。 cookies_txt = open('cookies.txt', 'r') #以reader读取模式,打开名为cookies.txt的文件。 cookies_dict = json.loads(cookies_txt.read()) #调用json模块的loads函数,把字符串转成字典。 cookies = requests.utils.cookiejar_from_dict(cookies_dict) #把转成字典的cookies再转成cookies本来的格式。 session.cookies = cookies #获取会话下的cookies except FileNotFoundError: #如果读取不到cookies文件,程序报“FileNotFoundError”(找不到文件)的错,则执行以下代码,重新登录获取cookies,再评论。 url = ' https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php' #登录的网址。 data = {'log': input('请输入你的账号:'), 'pwd': input('请输入你的密码:'), 'wp-submit': '登录', 'redirect_to': 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn', 'testcookie': '1'} #登录的参数。 session.post(url, headers=headers, data=data) #在会话下,用post发起登录请求。 cookies_dict = requests.utils.dict_from_cookiejar(session.cookies) #把cookies转化成字典。 cookies_str = json.dumps(cookies_dict) #调用json模块的dump函数,把cookies从字典再转成字符串。 f = open('cookies.txt', 'w') #创建名为cookies.txt的文件,以写入模式写入内容 f.write(cookies_str) #把已经转成字符串的cookies写入文件 f.close() #关闭文件 url_1 = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-comments-post.php' #文章的网址。 data_1 = { 'comment': input('请输入你想评论的内容:'), 'submit': '发表评论', 'comment_post_ID': '13', 'comment_parent': '0' } #评论的参数。 session.post(url_1, headers=headers, data=data_1) #在会话下,用post发起评论请求。
彩蛋,有道翻译的可视化处理
import requests import json from tkinter import Tk,Button,Entry,Label,Text,END class YouDaoFanyi(object): def __init__(self): pass def crawl(self,word): url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' #使用post需要一个链接 data={'i': word, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTIME', 'typoResult': 'false'} #将需要post的内容,以字典的形式记录在data内。 r = requests.post(url, data) #post需要输入两个参数,一个是刚才的链接,一个是data,返回的是一个Response对象 answer=json.loads(r.text) #你可以自己尝试print一下r.text的内容,然后再阅读下面的代码。 result = answer['translateResult'][0][0]['tgt'] return result class Application(object): def __init__(self): self.window = Tk() self.fanyi = YouDaoFanyi() self.window.title(u'我的翻译') #设置窗口大小和位置 self.window.geometry('310x370+500+300') self.window.minsize(310,370) self.window.maxsize(310,370) #创建一个文本框 #self.entry = Entry(self.window) #self.entry.place(x=10,y=10,width=200,height=25) #self.entry.bind("<Key-Return>",self.submit1) self.result_text1 = Text(self.window,background = 'azure') # 喜欢什么背景色就在这里面找哦,但是有色差,得多试试:http://www.science.smith.edu/dftwiki/index.php/Color_Charts_for_TKinter self.result_text1.place(x = 10,y = 5,width = 285,height = 155) self.result_text1.bind("<Key-Return>",self.submit1) #创建一个按钮 #为按钮添加事件 self.submit_btn = Button(self.window,text=u'翻译',command=self.submit) self.submit_btn.place(x=205,y=165,width=35,height=25) self.submit_btn2 = Button(self.window,text=u'清空',command = self.clean) self.submit_btn2.place(x=250,y=165,width=35,height=25) #翻译结果标题 self.title_label = Label(self.window,text=u'翻译结果:') self.title_label.place(x=10,y=165) #翻译结果 self.result_text = Text(self.window,background = 'light cyan') self.result_text.place(x = 10,y = 190,width = 285,height = 165) #回车翻译 def submit1(self,event): #从输入框获取用户输入的值 content = self.result_text1.get(0.0,END).strip().replace("\n"," ") #把这个值传送给服务器进行翻译 result = self.fanyi.crawl(content) #将结果显示在窗口中的文本框中 self.result_text.delete(0.0,END) self.result_text.insert(END,result) #print(content) def submit(self): #从输入框获取用户输入的值 content = self.result_text1.get(0.0,END).strip().replace("\n"," ") #把这个值传送给服务器进行翻译 result = self.fanyi.crawl(content) #将结果显示在窗口中的文本框中 self.result_text.delete(0.0,END) self.result_text.insert(END,result) print(content) #清空文本域中的内容 def clean(self): self.result_text1.delete(0.0,END) self.result_text.delete(0.0,END) def run(self): self.window.mainloop() if __name__=="__main__": app = Application() app.run()
tkinter 的用法介绍:https://www.runoob.com/python/python-gui-tkinter.html