大型分布式爬虫准备 scrapy + request

本文深入探讨了爬虫开发中的常见问题及解决策略,包括URL去重、使用Python执行JS脚本、环境管理等,同时提供了详细的Scrapy实战案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

636379-20190905214327393-1407207368.png

那些高手

爬虫好文

而我避免这些问题的方式,控制台清除所有定时

 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.youkuaiyun.com/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/

636379-20190917103210666-716647765.png

搭建自己的 ip 代理池

636379-20190914215646450-1832500080.png

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()

转载于:https://www.cnblogs.com/Frank99/p/11469180.html

【为什么学爬虫?】        1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是:网络请求:模拟浏览器的行为从网上抓取数据。数据解析:将请求下来的数据进行过滤,提取我们想要的数据。数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是:爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。Scrapy分布式爬虫Scrapy框架、Scrapy-redis组件、分布式爬虫等。通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求!【课程服务】 专属付费社群+定期答疑
内容概要:2025年大宗商品市场展望报告由世界银行发布,分析了能源、农业、金属和矿物、贵金属以及化肥等多个主要商品类别的市场发展与前景。报告指出,由于全球经济增长放缓和贸易紧张加剧,2025年大宗商品价格预计总体下降12%,2026年进一步下降5%,达到六年来的最低点。油价预计2025年平均为每桶64美元,2026年降至60美元,主要受全球石油消费放缓和供应增加的影响。农业商品价格预计2025年基本稳定,2026年下降3%,其中粮食和原材料价格分别下降7%和2%,但饮料价格上涨20%。金属价格预计2025年下降10%,2026年再降3%,特别是铜和铝价格将显著下跌。贵金属如黄金和白银因避险需求强劲,预计价格将继续上涨。报告还特别关注了疫情后大宗商品周期的变化,指出周期变得更短、更剧烈,主要受到宏观经济冲击、极端天气事件和地缘政治冲突的影响。 适用人群:对全球经济趋势、大宗商品市场动态及其对不同经济体影响感兴趣的政策制定者、投资者、分析师及研究机构。 使用场景及目标:①帮助政策制定者评估全球经济增长放缓对大宗商品市场的影响,从而调整经济政策;②为投资者提供有关未来大宗商品价格走势的风险提示,以便进行投资决策;③协助分析师和研究机构深入理解疫情后大宗商品市场的周期特征,识别潜在的投资机会和风险。 其他说明:报告强调,全球经济增长放缓、贸易紧张加剧以及地缘政治不确定性是影响大宗商品价格的主要因素。此外,极端天气事件和能源转型也对农业和能源商品市场产生了深远影响。报告呼吁各方关注这些结构性变化,并采取相应的风险管理措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值