Posted on:
Last modified:
注意已知条件(robots.txt 和 sitemap.xml)
一个简便方法是使用 site:example.com 查询,然而这种方法对于大站不适用
builtwith 模块
pip install builtwith
builtwith.parse(url) # returns a dict
python-whois 模块
pip install python-whois
import whois
whois.whois(url)
下载器需要提供的几个功能:
错误重试,仅当返回的错误为 500 的时候重试,一般 400 错误可认为不可恢复的网页
伪装 UA
策略 a. 爬取站点地图 sitemap b. 通过 ID 遍历爬取 i. ID 可能不是连续的,比如某条记录被删除了 ii. ID 访问失效 n 次以后可以认为遍历完全了
相对连接转化,这点可以利用 lxml 的 make_link_absolute 函数
处理 robots.txt 可以利用标准库的 robotsparser 模块
import robotsparser
rp = robotparser.RobotFileParser
rp.set_url("path_to_robots.txt")
rp.read()
rp.can_fetch("UA", "url")
True or False
支持代理
下载限速,粒度应该精确到每一个站点比较好
避免爬虫陷阱,尤其是最后一页自身引用自身的例子 a. 记录链接深度
例子:https://bitbucket.org/wswp/code/src/chpter01/link_crawler3.py
下载的第二步,就是把获得的网页传递给 Extractor 来提取内容,可以通过传递给下载函数回调来处理,但是这种耦合性太强了
执行下载时间估算也是很重要的,每个链接下载需要多长时间,整个过程需要多长时间 多线程的下载例子,手工模拟线程池
def process_queue(q):
pass
threads = []
while thread or crawl_queue:
for thread in threads:
if not threads.is_alive():
threads.remove(thread)
while len(threads) < max_threads and crawl_queue:
thread = threading.Thread(target=process_queue, daemon=True)
thread.start()
threads.append(thread)
time.sleep(some_time)
性能的增长与线程和进程的数量并不是成线性比例的,而是对数比例,因为切换要花费一定的时间,再者最终是受限于带宽的
依赖于 Ajax 的网站看起来更复杂,但是实际上因为数据和表现层的分离会更简单,但是如果逆向工程也不好得到通用的方法,如何构建一个辅助工具呢?表示出网页上哪些地方是动态加载的,列出 js 全局变量,列出可能的 jsonp 请求
利用 Ajax 接口时,可以利用各种边界情况,比如把搜索条件置为空,置为 *,置为 .
使用 Qt,使用 Selenium 或者 PhantomJS,这时附加 Cookie 等都是很严重的问题
使用机器识别验证码 使用 Pillow 和 pytesseract 识别验证码,但是 tesseract 本不是用来识别验证码的
img.convert("L")
img.point(lambda x: 0 if x < 1 else 255, "l")
tessact.image_to_string(img)
还可以通过限定字符集提高识别率
还可以使用人工打码平台
© 2016-2022 Yifei Kong. Powered by ynotes
All contents are under the CC-BY-NC-SA license, if not otherwise specified.
Opinions expressed here are solely my own and do not express the views or opinions of my employer.
友情链接: MySQL 教程站