大型分布式爬虫准备 scrapy + request
而我避免这些问题的方式,控制台清除所有定时
var id = setInterval(function() {}, 0);
while (id--) clearInterval(id);
$(articleSelector).css('height', 'initial')
$(articleSelector).removeClass('lock')
$('#locker').css('display', 'none')
python 运行 js 脚本
pip install PyExecJS
eleme.js
function getParam(){
return 'hello world!'
}
xxx.py
import execjs
import os
os.environ["EXECJS_RUNTIME"] = "PhantomJS"
node = execjs.get()
file = 'eleme.js'
ctx = node.compile(open(file).read())
js_encode = 'getParam()'
params = ctx.eval(js_encode)
print(params)
python 包管理
virtualenv virtualwrapper pipenv pyenv --》 conda
步骤
1. pipenv shell
2. pip install scrapy
3. scrapy shell # 可以做 简单调试
3. scrapy startproject videospider # 生成 基本骨架
4. scrapy genspider jobbole www.jobbole.com
5. 取巧 构造一个 main.py 用来在 IDE 里调试
爬虫中 url 去重
set 去重 是 非常占用内存的
md5 信息摘要 算法 之后会省很多, 但是仍然不如 bitmap 方式
bitmap 会 很容易 造成 hash 冲突
bloom filter 这一种 可以通过 hash 函数 减少 hash 冲突
简而言之 言而简之 urls --> set(urls) --> set(md5(url) s) --> bitmap( xxx ) --> bloom filter( multi_hash_func ( xxx ))
下面这个教程要看评论再说。。。坑哭了
https://blog.csdn.net/chenvast/article/details/79103288
爬取 cnblog 文章 练手
# 使用 pipenv 管理环境
mkdir spiders
cd spiders
pipenv install
pip install scrapy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
# 利用 模板生成 项目基本样子 类似于 springboot
scrapy startproject ArticleSpider
# 爬取 二级域名下的 文章
cd xxx\ArticleSpider\ArticleSpider\spiders\
scrapy genspider cnblog news.cnblogs.com
# 修改 settings.py 中 的 爬虫配置 ROBOTSTXT_OBEY 为 False
ROBOTSTXT_OBEY = False
# 打开 编辑自动生成的 spider/cnblog.py
# -*- coding: utf-8 -*-
import scrapy
import re
from ArticleSpider.items import ArticleItem
from ArticleSpider.utils.utils import get_md5
from scrapy.http import Request
from urllib import parse
class CnblogSpider(scrapy.Spider):
name = 'cnblog'
allowed_domains = ['news.cnblogs.com']
start_urls = ['http://news.cnblogs.com/']
def parse(self, response):
news_selector_list = response.xpath('//div[@id="news_list"]/div[@class="news_block"]')
for news_selector in news_selector_list:
content = news_selector.xpath('div[@class="content"]')
anchor = content.xpath('h2/a')
article_url = anchor.xpath('@href').extract()[0]
article_title = anchor.xpath("text()").extract()[0]
article_front_image_url = content.xpath('div[@class="entry_summary"]/a/@href').extract()[0]
footer = content.xpath('div[@class="entry_footer"]')
article_author = footer.xpath('a/text()').extract()[0]
matched = re.match('评论\((\d+)\)', footer.xpath('span[@class="comment"]/a/text()').extract()[0])
article_comments = matched.group(1) if matched else 0
article_view = footer.xpath('span[@class="view"]').extract()[0]
article_tag = footer.xpath('span[@class="tag"]').extract()[0]
article_item = ArticleItem()
article_item['article_url'] = article_url
article_item['article_title'] = article_title
article_item['article_front_image_url'] = article_front_image_url
article_item['article_author'] = article_author
article_item['article_comments'] = article_comments
article_item['article_view'] = article_view
article_item['article_tag'] = article_tag
article_item['article_id'] = get_md5(article_url)
yield Request(url=parse.urljoin(response.url ,article_url),meta={"item":article_item}, callback=self.parse_detail)
pass
def parse_detail(self, response):
pass
# 有些时候 我们可以使用 Itemloader 来让我们的代码变得更友好
item_loadder = ItemLoader(item=ArticleItem(), response=response)
item_loadder.add_xpath(field_name="article_url", xpath="//div[@id='news_list']/div[@class='news_block']/div[@class='content']/h2/a/@href")
.
.
.
next_urls_selector = response.xpath('//*[@id="sideleft"]/div[5]/a[11]')
总结 对付反爬
访问 500 一般是 UA 没设置
cookie 携带
token
salt
sign
ctrl + shift + f 很好用 在查找 js 调用时候
cookies 池
ip 代理 池
pip3 install faker
https://cmder.net/
搭建自己的 ip 代理池
mongo db 安装使用
# 创建 ipproxy 数据库 如果没有就创建
use ipproxy;
### 插入数据
db.ipproxy.insert({"ip_port":"192.168.0.18:5678"})
# 删除 数据库
db.dropDatabase()
# 删除集合
db.collection.drop()
# 查询集合
db.ipproxy.find().pretty()
db.createCollection("mycol", { capped : true, autoIndexId : true, size :
6142800, max : 10000 } )
db.ipproxy.drop()
如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。