首页 > 代码库 > 第5章 scrapy爬取知名问答网站

第5章 scrapy爬取知名问答网站

第五章感觉是第四章的练习项目,无非就是多了一个模拟登录。

不分小节记录了,直接上知识点,可能比较乱。

1.常见的httpcode:

技术分享

2.怎么找post参数?

先找到登录的页面,打开firebug,输入错误的账号和密码,观察post_url变换,从而确定参数。

3.读取本地的文件,生成cookies。

1 try:2     import cookielib #py23 except:4     import http.cookiejar as cookielib #py3

4.用requests登录知乎

技术分享
 1 # -*- coding: utf-8 -*- 2 __author__ = jinxiao 3  4 import requests 5 try: 6     import cookielib 7 except: 8     import http.cookiejar as cookielib 9 10 import re11 12 session = requests.session()  #实例化session,下面的requests可以直接换成session13 session.cookies = cookielib.LWPCookieJar(filename="cookies.txt") #实例化cookies,保存cookies14 #读取cookies15 try:16     session.cookies.load(ignore_discard=True)17 except:18     print ("cookie未能加载")19 20 #知乎一定要加上浏览器的头,其他网站不一定,一般都是要的21 agent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0"22 header = {23     "HOST":"www.zhihu.com",24     "Referer": "https://www.zhizhu.com",25     User-Agent: agent26 }27 28 def is_login():29     #通过个人中心页面返回状态码来判断是否为登录状态30     inbox_url = "https://www.zhihu.com/question/56250357/answer/148534773"31     response = session.get(inbox_url, headers=header, allow_redirects=False)  #禁止重定向,判断为是否登录32     if response.status_code  != 200:33         return False34     else:35         return True36 37 def get_xsrf():38     #获取xsrf code39     response = session.get("https://www.zhihu.com", headers=header)40     match_obj = re.match(.*name="_xsrf" value="http://www.mamicode.com/(.*?)", response.text)41     if match_obj:42         return (match_obj.group(1))43     else:44         return ""45 46 47 def get_index():48     response = session.get("https://www.zhihu.com", headers=header)49     with open("index_page.html", "wb") as f:50         f.write(response.text.encode("utf-8"))51     print ("ok")52 53 def zhihu_login(account, password):54     #知乎登录55     if re.match("^1\d{10}",account):56         print ("手机号码登录")57         post_url = "https://www.zhihu.com/login/phone_num"58         post_data =http://www.mamicode.com/ {59             "_xsrf": get_xsrf(),60             "phone_num": account,61             "password": password62         }63     else:64         if "@" in account:65             #判断用户名是否为邮箱66             print("邮箱方式登录")67             post_url = "https://www.zhihu.com/login/email"68             post_data =http://www.mamicode.com/ {69                 "_xsrf": get_xsrf(),70                 "email": account,71                 "password": password72             }73 74     response_text = session.post(post_url, data=http://www.mamicode.com/post_data, headers=header)75     session.cookies.save()76 77 zhihu_login("18782902568", "admin123")78 # get_index()79 print(is_login())
zhihu_requests_login

5.在shell调试中添加UserAgent

 scrapy shell -s USER_AGENT=‘...‘ url

6.JsonView插件

可以很好的可视化看json

7.写入html文件

with open(‘‘e:/zhihu.html‘‘,"wb") as f:    f.write(response.text.encode(utf-8))

8.yield理解

  如果是yield item 会到pipelins中处理

  如果是yield Request 会到下载器去下载

9.在mysql中怎么去重,设置主键去重,主键冲突

解决:在插入的sql语句后面加上 ON DUPLICATE KEY UPDATE content=VALUES(content) #这是需要更新的内容

10.手动输入验证码(zhihu.login_requests.py)

 1 def get_captcha(): 2     import time 3     t=str(int(time.time()*1000)) 4     captcha_url="https://www.zhihu.com/captcha.gif?r={0}&type=login".format(t) 5     t=session.get(captcha_url,headers=header) 6     with open("captcha.jpg","wb") as f: 7         f.write(t.content) 8         f.close() 9     captcha=input("输入验证码:")10     return captcha
#为什么是第五行是session,而不是requests?
#因为requests会重新建立一次绘画 session,这与后面的参数不符,输入的验证码并不是当前的验证码。

作者:今孝

出处:http://www.cnblogs.com/jinxiao-pu/p/6749332.html

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

 

第5章 scrapy爬取知名问答网站