scrapy有三种方法模拟登陆方式:
- 直接携带cookies
- 找url地址,发送post请求存储cookie
- 找到对应的form表单,自动解析input标签,自动解析post请求的url地址,自动带上数据,自动发送请求
1、携带cookies登陆github
代码语言:javascript复制import scrapy
import re
class Login1Spider(scrapy.Spider):
name = 'login1'
allowed_domains = ['github.com']
start_urls = ['https://github.com/NoobPythoner'] # 这是一个需要登陆以后才能访问的页面
def start_requests(self): # 重构start_requests方法
# 这个cookies_str是抓包获取的
cookies_str = '...' # 抓包获取
# 将cookies_str转换为cookies_dict
cookies_dict = {i.split('=')[0]:i.split('=')[1] for i in cookies_str.split('; ')}
yield scrapy.Request(
self.start_urls[0],
callback=self.parse,
cookies=cookies_dict
)
def parse(self, response): # 通过正则表达式匹配用户名来验证是否登陆成功
result_list = re.findall(r'noobpythoner|NoobPythoner', response.body.decode())
print(result_list)
pass
注意:
- scrapy中cookie不能够放在headers中,在构造请求的时候有专门的cookies参数,能够接受字典形式的coookie
- 在setting中设置ROBOTS协议、USER_AGENT
2、使用scrapy.FormRequest()登录
通过scrapy.FormRequest能够发送post请求,同时需要添加fromdata参数作为请求体,以及callback
代码语言:javascript复制 yield scrapy.FormRequest(
"https://github.com/session",
formdata={
"authenticity_token":authenticity_token,
"utf8":utf8,
"commit":commit,
"login":"****",
"password":"****"
},
callback=self.parse_login
)
在网页爬取的时候,有时候会使用scrapy.FormRequest向目标网站提交数据(表单提交)。参照scrapy官方文档的标准写法是:
代码语言:javascript复制# header信息
unicornHeader = {
'Host': 'www.example.com',
'Referer': 'http://www.example.com/',
}
# 表单需要提交的数据
myFormData = {'name': 'John Doe', 'age': '27'}
# 自定义信息,向下层响应(response)传递下去
customerData = {'key1': 'value1', 'key2': 'value2','proxy': 'http://127.0.0.1:8888'}
yield scrapy.FormRequest(url = "http://www.example.com/post/action",
headers = unicornHeader,
method = 'POST', # GET or POST
formdata = myFormData, # 表单提交的数据
meta = customerData, # 自定义,向response传递数据
callback = self.after_post,
errback = self.error_handle,
# 如果需要多次提交表单,且url一样,那么就必须加此参数dont_filter,防止被当成重复网页过滤掉了
dont_filter = True
)
但是,当表单提交数据myFormData 是形如字典内嵌字典的形式,又该如何写?
代码语言:javascript复制# formDate 必须构造如下:
myFormData = {
'marketplaceID' : 'ATVPDKIKX0DER',
'seller' : 'A2FE6D62A4WM6Q',
# 注意下面这一行,内部字典是作为一个字符串的形式
'productSearchRequestData' :'{"marketplace":"ATVPDKIKX0DER","seller":"A2FE6D62A4WM6Q","url":"/sp/ajax/products","pageSize":12,"searchKeyword":"","extraRestrictions":{},"pageNumber":"1"}'
}
3、使用scrapy.Formrequest.from_response登陆github
代码语言:javascript复制import scrapy
import re
class Login3Spider(scrapy.Spider):
name = 'login3'
allowed_domains = ['github.com']
start_urls = ['https://github.com/login']
def parse(self, response):
yield scrapy.FormRequest.from_response(
response, # 传入response对象,自动解析
# 可以通过xpath来定位form表单,当前页只有一个form表单时,将会自动定位
formxpath='//*[@id="login"]/form',
formdata={'login': '****', 'password': '***'},
callback=self.parse_login
)
def parse_login(self,response):
ret = re.findall(r"noobpythoner|NoobPythoner", response.text)
print(ret)