Python爬虫个人记录利用Python在豆瓣上写一篇日记

Posted _Undo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫个人记录利用Python在豆瓣上写一篇日记相关的知识,希望对你有一定的参考价值。

涉及关键词:requests库 requests.post方法 cookies登陆

version 1.5(附录):使用post方法登陆豆瓣,成功! 缺点:无法获得登陆成功后的cookie,要使用js等方法来获得cookie,放弃

versoin 2.0(附录):  使用selenium模拟浏览器登陆豆瓣,使用浏览器自动加载js,并成功获取cookies,可以为后来浏览使用,可行,成功!

 

一、目的分析

利用cookie登陆豆瓣,并写一篇日记 
https://www.douban.com/note/636142594/

二、步骤分析

1、使用浏览器登陆豆瓣,得到并分析cookie

2、使用cookie模拟登陆豆瓣(使用账号密码登陆也可以,需要验证码,cookie的时效一般就几天)

3、分析浏览器写日记行为,在python中模拟post行为

4、源码及测试

三、scrapy shell 模拟登陆

1、使用浏览器登陆豆瓣,在fidder中获得cookie

cookie中有许多项(并不是全部需要),经过一条条测试,发现只要包含\'dbcl2\'就能登录

2、打开scrapy shell 测试登陆

  模拟浏览器User-Agent和cookies

$ scrapy shell
...
from scrapy import Request
cookies = {\'dbcl2\':\'"164753551:kjyoTNgwwII"\'}
headers={\'User-Agent\':\'Mozilla/5.0\'}
req = Request(\'https://www.douban.com/mine/\', headers=headers,cookies = cookies)
fetch(req)
#使用浏览器检查元素得到xpath(方法参考爬虫(一)(二))(日记内容权限未自己可见,若可看见日记内容便模拟登陆成功)
>>> response.xpath(\'//*[@id="note_636142594_short"]\').extract()
[\'<div class="note" id="note_636142594_short">Hello Douban</div>\']
>>> response.xpath(\'//*[@id="note_636142594_short"]/text()\').extract()
[\'Hello Douban\']
>>>

得到日记内容,可见模拟登陆成功,cookie可用

四、python 写豆瓣日记

1、使用浏览器写日记,并在fidder中观察行为

 

 

 

发现浏览器进行了POST https://www.douban.com/note/create HTTP/1.1的行为

post 的内容是ck=BsJH&note_id=636142544&note_title=test_2&note_text=hello2&author_tags=&note_privacy=P

ck=BsJH  是cookie中的一个值 

note_id=636142544(估计是用户id,直接照抄)

note_id=636142544&note_title=test_2&note_text=hello2(标题,以及内容)

另外三个参数不重要,使用默认就行

 

2、使用python模拟post行为

#post 所需要的参数

requests.post(url = url,data = data,headers=headers,verify=False,cookies = cookies)

五、源码及测试

源码
 1 import requests
 2 ### 1、首先登陆任何页面,获取cookie
 3 
 4 #使用requests打开https时会产生warming,加上这句屏蔽
 5 requests.packages.urllib3.disable_warnings()
 6 
 7 headers = dict()
 8 headers[\'User-Agent\'] = \'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3387.400 QQBrowser/9.6.11984.400\'
 9 
10 cookies = dict()
11 cookies = {#\'ll\':\'"118201"\',
12             #\'bid\':\'PUWFXi53MHA\',
13             #\'_ga\':\'GA1.2.1759080547.1501749204\',
14             #\'__yadk_uid\':\'rjmLGzYjJuHI5lHNHJX3lOgBAltgb5Xy\',
15             #\'gr_user_id\':\'16c2c492-9e32-4af2-9c35-230e8d43db06\',
16             #\'ps\':\'y\',
17             #\'_pk_ref.100001.8cb4\':\'%5B%22%22%2C%22%22%2C1504529257%2C%22https%3A%2F%2Faccounts.douban.com%2Flogin%3Fredir%3Dhttps%253A%252F%252Fwww.baidu.com%252Flink%253Furl%253DEh3nGSbWZ6S0P2OQc7QHrEzCkdwJewBLjFnBpRTRwKv4QwoLScCwKCSh9iQFeDAx%2526wd%253D%2526eqid%253D8191d1c1000627560000000359ad43f4%22%5D\',
18             #\'ap\':\'1\',
19             #\'_vwo_uuid_v2\':\'57D26B154CE7E363177CFD5F35F06F34|e63fa1bfe4c07598b6454ae2a97166cb\',
20             \'dbcl2\':\'"164753551:kjyoTNgwwII"\'
21             #\'ck\':\'osar\',
22             #\'_pk_id.100001.8cb4\':\'70e88acbc88cb16d.1501749196.11.1504530290.1504527380.\',
23             #\'_pk_ses.100001.8cb4\':\'*\',
24             #\'push_noty_num\':\'0\',
25             #\'push_doumail_num\':\'0\',
26             #\'__utma\':\'30149280.1759080547.1501749204.1504529257.1504530054.20\',
27             #\'__utmb\':\'30149280.5.10.1504530054\',
28             #\'__utmc\':\'30149280\',
29             #\'__utmz\':\'30149280.1504530054.20.16.utmcsr\',
30             #\'__utmv\':\'30149280.16475\'
31             }
32 
33 data = {\'ck\':\'BsJH\',
34         \'note_id\':\'636142544\',
35         \'note_title\':\'HelloPython\',
36         \'note_text\':\'HelloPython\'
37         #\'author_tags\':\'\',
38         #\'note_privacy\':\'P\'
39     }
40 url = \'https://www.douban.com/note/create\'
41 #注意访问https链接时要加上verify=False参数,否则回报错
42 ret = requests.post(url = url,
43                     data = data,
44                     headers=headers,
45                     verify=False,
46                     cookies = cookies
47                     )
48 print(ret.text[:300])
49 print(ret.cookies.get_dict())
View Code

测试结果

大功告成!

五、总结分析

1、这次使用cookie登陆免去了验证码麻烦,下次希望能研究验证码的破解

2、cookie的使用时间有限,隔一段时间就要更换

3、requests对https的限制挺严格的,需要加入verify=False,并且要屏蔽警告信息

  #使用requests打开https时会产生warming,加上这句屏蔽
  requests.packages.urllib3.disable_warnings()

 

附录(一)

vesion 1.5

import requests
from lxml import etree
import time

#使用requests打开https时会产生warming,加上这句屏蔽
requests.packages.urllib3.disable_warnings()

def get_github_html(url):
    \'\'\'
    这里用于获取登录页的html,以及cookie
    :param url: https://github.com/login
    :return: 登录页面的HTML,以及第一次的cookei
    \'\'\'
    response = requests.get(url,verify=False)
    first_cookie = response.cookies.get_dict()
    return response.text,first_cookie

def get_token(html,xrule):
    \'\'\'
    处理登录后页面的html
    :param html:
    :return: 获取csrftoken
    \'\'\'   
    selector = etree.HTML(html)
    token = selector.xpath(xrule)[0]
    #print(token)

    return token


def gihub_login(url,cookie):
    \'\'\'
    这个是用于登录
    :param url: https://github.com/session
    :param token: csrftoken
    :param cookie: 第一次登录时候的cookie
    :return: 返回第一次和第二次合并后的cooke
    \'\'\'

    data={
        "source":"movie",
        "redir":"https://movie.douban.com/chart",  
        "form_email":"***********",  
        "form_password":"***********",  
        "login":u\'登录\',
        "remember":"on"
    }
    response = requests.post(url,data=data,cookies=cookie,verify=False)
    print(response.status_code)
    print(response.url)
    print(response.cookies.get_dict())
    cookie2 = response.cookies.get_dict()
    #这里注释的解释一下,是因为之前github是通过将两次的cookie进行合并的
    #现在不用了可以直接获取就行
    cookie.update(cookie2)
    print(cookie)
    #print(response.text)
    return cookie


if __name__ == \'__main__\':
    Base_URL = "https://movie.douban.com/?_t_t_t=0.6509884103763016"
    Login_URL = "https://www.douban.com/accounts/login"
    html,cookie = get_github_html(Base_URL)
    print(cookie)
    #xrule = \'//*[@id="login"]/form/div[1]/input[2]/@value\'
    #token = get_token(html,xrule)
    #print(token)
    time.sleep(3)
    cookie2 = gihub_login(Login_URL,cookie)
    time.sleep(3)
    response = requests.get("https://www.douban.com/mine/",verify=False,cookies=cookie2)
    print(response.cookies.get_dict())
    print(response.url,response.status_code)
    #print(response.text)
vesion 1.5

vesion 2.0

from selenium import webdriver

Base_URL = "https://movie.douban.com/?_t_t_t=0.6509884103763016"
Login_URL = "https://www.douban.com/accounts/login"

browser = webdriver.Firefox()
browser.get(\'https://movie.douban.com/\')
cookies = browser.get_cookies()
#print(cookies)

#打开网址
browser.get(\'https://www.douban.com/accounts/login\')
#browser.maximize_window()#窗口最大化,可有可无,看情况

#输入账户密码
#我请求的页面的账户输入框的\'id\'是username和密码输入框的\'id\'是password
browser.find_element_by_id(\'email\').clear()
browser.find_element_by_id(\'email\').send_keys(u\'***********\')
browser.find_element_by_id(\'password\').clear()
browser.find_element_by_id(\'password\').send_keys(u\'***********\')

#remember me
browser.find_element_by_id(\'remember\').click()

#输入完用户密码当然就是提交了,通过\'name\'为login来找到提交按钮
browser.find_element_by_name(\'login\').click()

#print(browser.current_url)

if browser.current_url ==\'https://www.douban.com/accounts/login\':
    #输入账户密码
    #我请求的页面的账户输入框的\'id\'是username和密码输入框的\'id\'是password
    browser.find_element_by_id(\'email\').clear()
    browser.find_element_by_id(\'email\').send_keys(u\'***********\')
    browser.find_element_by_id(\'password\').clear()
    browser.find_element_by_id(\'password\').send_keys(u\'***********\')
    captcha_field = input("请输入验证码:")
    captcha_field = str(captcha_field)
    browser.find_element_by_id(\'captcha_field\').clear()
    browser.find_element_by_id(\'captcha_field\').send_keys(captcha_field)
    #remember me
    browser.find_element_by_id(\'remember\').click()
    #输入完用户密码当然就是提交了,通过\'name\'为login来找到提交按钮
    browser.find_element_by_name(\'login\').click()
    

browser.get("https://www.douban.com/mine/")

cookies2 = browser.get_cookies()
print(browser.current_url)
print(cookies2)

#浏览器退出
browser.quit()
vesion 2.0

 

 



 

以上是关于Python爬虫个人记录利用Python在豆瓣上写一篇日记的主要内容,如果未能解决你的问题,请参考以下文章

python-利用豆瓣爬虫发个动态

python爬虫知识点三--解析豆瓣top250数据

#私藏项目实操分享#Python爬虫实战,requests+xpath模块,Python实现爬取豆瓣影评

Python--爬虫豆瓣250电影网站

Python爬虫入门 | 4 爬取豆瓣TOP250图书信息

python爬取豆瓣电影Top250(附完整源代码)