Scrapy爬取需要登录的网站有两种方法:
1、首先登录网站,复制登录后的cookie和header粘贴到代码中,模拟浏览器操作。此方法比较简洁,不过cookie有时间限制,过期后需要重新获取cookie,不适合长期项目。
2、使用FormRequest.from_response()方法,此方法足以满足80%的网站登录,使用formdata参数提交需要的Post数据,但是有一点需要特别注意:
此方法一定要确认URl有form表单!!!
此方法一定要确认URl有form表单!!!
此方法一定要确认URl有form表单!!!
如果请求URL没有form表单是无法提交参数的。
3、如果没有form表单,使用FormRequest实例,手动指定post地址,
使用scrapy.FormRequest()进行登陆,但此时不再使用from.request;
只是对设置的url发送post请求,对得到的cookies进行存储
详情参考:
https://blog.csdn.net/qq_42293758/article/details/87925623
简化版:
首先安装scrapy:https://www.jianshu.com/p/ddf57836d625
打开CMD,执行下面代码
scrapy startprojrct pachong1 #创建项目
cd pachong1 #进入项目
scrapy genspider ‘项目名’ ‘地址’ #如下图↓
生成爬虫文件.png
打开项目文件夹,打开spiders下生成的爬虫文件。
此处使用了自己搭建的wordpress举例:
直接复制这段源码,只需修改:url连接(爬取目标url和登录url)和form中的参数,
可以登录大部分网站,需要爬取的项目和数据在parse_item中修改就可以。如果需要保存在本地,parse_item中爬取的数据需要在items中定义。
# -*- coding: utf-8 -*-
import scrapy
from scrapy.spiders import Rule,Request
class DoubanSpider(scrapy.Spider):
name = 'worpress'
allowed_domains = ['192.168.5.111:8000']
start_urls = 'http://192.168.5.111:8000/wp-admin/' #需要爬取url连接
#请求登录url,返回meta记录,保存cookie
def start_requests(self):
return [Request(url = self.start_urls, meta = {'cookie':1}, callback = self.post_login)]
#传递登录参数
def post_login(self, response):
return scrapy.FormRequest(
url = 'http://192.168.5.111:8000/wp-login.php', #登录url连接
method = 'POST', # 指定访问方式
#form表单中的参数传递
formdata={'log': '登录用的账户',
'pwd': '登录用的密码',
'wp-submit': 'Log In',
'redirect_to': 'http://192.168.5.111:8000/wp-admin/',
'testcookie': '1'},
meta = {'cookie':response.meta['cookie']},
dont_filter = True, # 不进行去重处理
callback = self.after_login
)
#返回登录后meta
def after_login(self, response):
url = self.start_urls
yield Request(url = url, meta = {'cooki':1}, callback = self.parse_item, dont_filter = True)
#打印欢迎登陆,查看是否爬取成功
#注意:需要爬取的项目需要在items中定义,此处不保存,只是验证登录成功
def parse_item(self, response):
#爬取wordpress欢迎标语:Welcome to wordpress
author = response.xpath('//*[@id="welcome-panel"]/div/h2/text()').extract_first()
print(author)
with open('worpress.txt','wb') as f:
f.write(response.body) #保存源码,验证和登录后源码是否相同
return
登录成功.png