setting文件
为什么项目中需要配置文件
在配置文件中存放一些公共变量,在后续的项目中便便修改,注意其中的变量名一般全部大写
配置文件中的变量使用方法
导入即可使用
settings.py中的重点字段和内涵
USER_AGENT 设置ua
ROBOTSTXT_OBEY 是否遵守robots协议,默认是遵守
CONCURRENT_REQUESTS 设置并发请求的数量,默认是16个
DOWNLOAD_DELAY 下载延迟,默认无延迟
COOKIES_ENABLED 是否开启cookie,即每次请求带上前一次的cookie,默认是开启的
DEFAULT_REQUEST_HEADERS 设置默认请求头
SPIDER_MIDDLEWARES 爬虫中间件,设置过程和管道相同
DOWNLOADER_MIDDLEWARES 下载中间件
随机更换user-agent
每次url请求更换一次user-agent
pip install fake-useragent
settings
DOWNLOADER_MIDDLEWARES = {
# 'ArticleSpider.middlewares.MyCustomDownloaderMiddleware': 543,
'ArticleSpider.middlewares.RandomUserAgentMiddleware': 400,
}
middlewares
from fake_useragent import UserAgent
class RandomUserAgentMiddleware(object):
def __init__(self, crawler):
super(RandomUserAgentMiddleware, self).__init__()
self.ua = UserAgent()
# 若settings中没有设置RANDOM_UA_TYPE的值默认值为random,
# 从settings中获取RANDOM_UA_TYPE变量,值可以是 random ie chrome firefox safari opera msie
self.ua_type = crawler.settings.get('RANDOM_UA_TYPE', 'random')
@classmethod
def from_crawler(cls, crawler):
return cls(crawler)
def process_request(self, request, spider):
def get_ua():
'''根据settings的RANDOM_UA_TYPE变量设置每次请求的User-Agent'''
return getattr(self.ua, self.ua_type)
ua = get_ua()
request.headers.setdefault('User-Agent', get_ua())
ip代理
方案一:免费版
自定义函数获取网上的一些免费代理ip
settings
DOWNLOADER_MIDDLEWARES = {
'ArticleSpider.middlewares.RandomProxyMiddleware': 400,
}
middlewares
class RandomProxyMiddleware(object):
#动态设置ip代理
def process_request(self, request, spider):
request.meta["proxy"] = get_random_ip() # 这个自定义函数返回一个随机代理ip:port
方案二:收费版
github上scrapy-proxies等等
在线打码
编码识别:由于验证码识别难度大,而且易更新,所以编码识别验证码(不推荐)
在线打码:调用已经开发好的在线验证码识别软件接口识别验证码。识别率在90%以上,并且效率高(推荐)
人工打码:识别率近100%,但是成本高(用于复杂的)
cookie
1.一些网站会跟踪cookie,如果不需要登陆的网站,可禁用cookie,降低被ban概率,scrapy默认开启cookie
COOKIES_ENABLED = False
2.配合其他程序使用,比如其使用selenium把登陆之后的cookie获取到保存到本地,scrapy发送请求之前先读取本地cookie
importscrapyimportreclassRenrenSpider(scrapy.Spider):
name= 'renren'allowed_domains= ['renren.com']
start_urls= ['http://www.renren.com/941954027/profile']defstart_requests(self):
cookie_str= "cookie_str"cookie_dict= {i.split("=")[0]:i.split("=")[1] for i in cookie_str.split(";")}yieldscrapy.Request(
self.start_urls[0],
callback=self.parse,
cookies=cookie_dict,#headers={"Cookie":cookie_str}
)defparse(self, response):
ret= re.findall("新用户287",response.text)print(ret)yieldscrapy.Request("http://www.renren.com/941954027/profile?v=info_timeline",
callback=self.parse_detail
)defparse_detail(self,response):
ret= re.findall("新用户287",response.text)print(ret)
cookie登录人人网
自动限速
调整某些参数,如
AUTOTHROTTLE_ENABLED = True
DOWNLOAD_DELAY = 3
selenium
作用:浏览器操控
安装selenium
pip install selenium
下载对应浏览器的驱动
第三方(微博)登录知乎
import time
from selenium import webdriver
from scrapy.selector import Selector
browser = webdriver.Chrome(executable_path="D:/Package/chromedriver.exe")
time.sleep(2) # 延时为了让页面加载完
browser.get("https://www.zhihu.com/#signin")
browser.find_element_by_css_selector(".qrcode-signin-cut-button").click()
browser.find_element_by_css_selector(".signup-social-buttons").click()
browser.find_element_by_css_selector(".js-bindweibo").click()
#browser.switch_to.window(browser.window_handles[-1])
browser.find_element_by_css_selector(".WB_iptxt").send_keys("xxx")
browser.find_element_by_css_selector("input[node-type='passwd']").send_keys("xxx")
browser.find_element_by_css_selector("a[node-type='submit']").click()
time.sleep(2) # 延时为了让页面加载完
browser.find_element_by_css_selector("a[node-type='submit']").click()
第三方(QQ)登录知乎
# -*- coding: utf-8 -*-
__author__ = 'hy'