那些高手css
爬虫好文html
而我避免这些问题的方式,控制台清除全部定时 var id = setInterval(function() {}, 0); while (id--) clearInterval(id); $(articleSelector).css('height', 'initial') $(articleSelector).removeClass('lock') $('#locker').css('display', 'none')
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)
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 里调试
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
# 使用 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/
# 建立 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()