scrapy登录网站

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。