在爬取的过程当中发现,有一些平台是须要登陆后才能访问标的详细信息或者标的列表,广西这个叫东盟贷的网贷平台就是如此。对于这种网站,一般有两种应对方式:php
1.Scrapy结合selenium进行爬取,这样就不会存在cookie和登陆的这些问题了,保持chrome不关闭就行。css
2.Scrapy模拟登陆chrome
此次经过Scrapy模拟登陆来对东盟贷进行数据的抓取,只写逻辑就行,具体操做就不写了。浏览器
1.须要登陆cookie
2.无需验证码dom
3.登录后会自动跳转到用户中心scrapy
import scrapy from scrapy.http import FormRequest,Request from urllib import parse
事件逻辑:ide
1.模拟浏览器向网站发起登陆请求工具
2.根据登录后跳转的url判断是否登陆成功post
3.若是登陆成功,则对列表页的url进行抽取
4.将抽取到的具体标的url传递给parse_detail进行详细数据的爬取
5.数据序列化
6.入库
import scrapy from scrapy.http import FormRequest,Request from urllib import parse class DongmengSpider(scrapy.Spider): name = 'dongmeng' allowed_domains = ['www.dongmengdai.com'] # 设置基本的agent和referer header = { "HOST": "www.dongmengdai.com", "Referer": "https://www.dongmengdai.com/view/regphone.php", 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0" } def start_requests(self): """ 经过FormRequest进行数据的post操做 提交请求时带上header,用户名,密码 提交请求后调用is_login判断是否登陆成功 :return: """ return [ FormRequest( "https://www.dongmengdai.com/index.php?user&q=action/login", headers=self.header, formdata={"keywords": "13509090909", "password": "123456789"}, callback=self.is_login )] def parse(self, response): """ 接收传递过来的response(标的列表页) 在当前页取到具体的标的url,传递到parsdetail进行具体的数据爬取 """ total = response.css('.table-responsive.list-bid .table.margin-no tbody:last-child tr') for i in total: target_urls = i.css('td:first-child a::attr(href)').extract_first("") yield Request(url=parse.urljoin("https://www.dongmengdai.com",target_urls),callback=self.parse_detail) def parse_detail(self, response): """ 爬取标的信息操做在这里编写 """ pass def is_login(self, response): """ 根据返回的url判断是否登录成功 若是成功则将列表url传递给parse方法进行列表页的数据爬取 """ if "user" in response.url: print("登录成功") yield Request(url="https://www.dongmengdai.com/view/Investment_list_che.php",callback=self.parse)