scrapy——4
- 动态的设置User-Agent(随即切换User-Agent,模拟不同的用户的浏览器信息)
- 禁用Cookies(也就是不启用cookies middleware,不向Server发送cookies的使用发现爬虫行为)可以通过COOKIES_ENABLED控制CookiesMiddleware开启或关闭
- 设置延迟下载(防止访问过于频繁,设置为2秒或者更高)
- Google Cache 和 BaiduCache:如果可能的话,使用谷歌/百度等搜索引擎服务器页面缓存获取页面数据。
- 使用Ip地址池:;VPN和代理IP,现在大部分网站都是根据IP来反爬的
Log levels——Scrapy提供5层loggin等级:
- CRITICAL - 严重错误(critical)
- ERROR - 一般错误(regular errors)
- WARNING - 警告信息(warning messages)
- INFO - 一般信息(informational messages)
- DEBUG - 调试信息(debugging messages)
logging设置:
通过在setting.py中进行以下设置可以被用来配置logging:
- LOG_ENABLED 默认: True,启用logging
- LOG_ENCODING 默认: 'utf-8',logging使用的编码
- LOG_FILE 默认: None,在当前目录里创建logging输出文件的文件名
- LOG_LEVEL 默认: 'DEBUG',log的最低级别
- LOG_STDOUT 默认: False 如果为 True,进程所有的标准输出(及错误)将会被重定向到log中。例如,执行 print "hello" ,其将会在Scrapy log中显示。
- 在尝试运行代码时,这样输入 scrapy crawl xxxx --nolog 输出时不会弹出logging信息
- url: 就是需要请求,并进行下一步处理的url
- callback: 指定该请求返回的Response,由那个函数来处理。
- method: 请求一般不需要指定,默认GET方法,可设置为"GET", "POST", "PUT"等,且保证字符串大写
- headers: 请求时,包含的头文件。一般不需要
- meta: 比较常用,在不同的请求之间传递数据使用的。字典dict型
- encoding: 使用默认的 'utf-8' 就行。
- dont_filter: 表明该请求不由调度器过滤。这是当你想使用多次执行相同的请求,忽略重复的过滤器。默认为False。
- status: 响应码
- _set_body(body): 响应体
- _set_url(url):响应url
实战— 豆瓣登陆
- 先创建项目
- douban_login\settings.py 设置请求头以及你的账号和密码(setting中)
- douban_login\spiders\douban_spider.py 写代码
# -*- coding: utf-8 -*-
import scrapy
from ..settings import username, password class DoubanSpiderSpider(scrapy.Spider):
name = 'douban_spider'
allowed_domains = ['douban.com']
start_urls = ['https://accounts.douban.com/login'] def start_requests(self):
data = { # POST请求多要携带的数据,由formdata传递
'source': 'index_nav',
'form_email': username,
'form_password': password,
}
yield scrapy.FormRequest(url=self.start_urls[0], formdata=data, callback=self.login_after) def login_after(self, response):
print(response.url)
user = response.xpath('//a[@class="bn-more"]/span/text()').extract_first() # 获取用户姓名,方便确认登陆是或否成功 print('当前用户:%s'%user) '''
douban_login$ scrapy crawl douban_spider --nolog
https://www.douban.com/
当前用户:pywjh的帐号
'''
实战二——gethub登陆
方法雷同,在setting中设置用户名和密码,需要注意的是,gethub有一个令牌的反爬措施,需要get请求一个登陆页面获取令牌,再POST请求登陆
# -*- coding: utf-8 -*-
from ..settings import username, password import scrapy class GithubSpider(scrapy.Spider):
name = 'github'
allowed_domains = ['github.com']
start_urls = ['https://github.com/login'] def parse(self, response):
token = response.xpath("//input[@name='authenticity_token']/@value").extract_first()
data = {
'utf8': '✓',
'authenticity_token': token,
'login': username,
'password': password,
'commit': 'Sign in',
}
yield scrapy.FormRequest(
url='https://github.com/session',
formdata=data,
callback=self.parse_item) def parse_item(self,response):
name = response.xpath('//*[@id="user-links"]/li[3]/details/summary/img/@alt').extract_first().replace('@', '')
print('当前用户:%s'%name)