你见过哪些令你瞠目结舌的爬虫技巧?
瞠目结舌系列:
http://www.zhihu.com/question/38241342
1楼(未知网友)
excel 的Power Query 插件。
如果vb熟悉。 还可以直接写数据库。 然后excel 负责ui展现
这一切。几秒搞定。。入手简单啊。。。。
2楼(未知网友)
因为正在搞一套自用爬虫框架所以冒个泡泡……
写爬虫什么的……我想说纯Python爬虫写起来并不爽啊……要爽必须是Python写分布式调度+CasperJS/PhantomJS的神奇组合。
CasperJS已经把写爬虫从构造请求的层面拽到了模拟动作的层面,以至于以前要费劲抓异步请求看js凑参数一系列流程变成了点击、填表、点击这样的动作模拟,对于一脸的ajax页面和所谓的SIP应用抓起来跟玩一样……
啊当然这套办法对搜索引擎式的通用爬虫还是不太好使的,毕竟慢不少。
3楼(未知网友)
用1024练手……不怕没有动力……
4楼(站大爷用户)
瞠目结舌啊?
有个爬虫变着UA爬我的站。。。然而IP没变。。。
于是就给封掉了。。。瞠目结舌啊!
5楼(站大爷用户)
额,说个囧事吧。最近在学go,随手用go写了个小爬虫,从入口页开始解析并找到站内地址,然后开个goroutine去爬,对,没有控制线程数。用的公司的代理出口,然后顺手用hduoj做测试,结果瞬间把它爬挂了…我真的只是测试一下代码而已,不是故意DOS你们的啊…
6楼(未知网友)
说一个我的,不算瞠目结舌。我当时爬一个网站的时候需要大量代理,正好手上有不少PHP的虚拟空间,就是万网卖的那种,几十块钱一年,只能上传PHP代码。我就用PHP写了一个代理脚本,应该算应用层代理了吧,还加了双向接口验证,伪装成普通文件,瞬间有了几十个代理,一直在用,这个代理好像也不可追踪。
===========================================================
其实非常简单,把url用GET 或者POST提交给PHP脚本,脚本用file_put_contents(url)获取数据,然后把数据返回给你就行了。完全匿名哈哈。
7楼(未知网友)
说一个只有在大规模爬取的时候才用得到的技巧吧.
比如你在建立一个汽车数据库, 需要从 上百万各种来源爬一大堆元数据, 肯定不能靠人了, 训练一个模型也太花时间.
有一种简单可行的办法, 首先去google或者垂直网站抓元数据
想办法将元数据与它来源的url配对 (比如google肯定会有来源url)
这样对于一个url, 你能知道它的提取结果是什么, 然后能找到对应页面什么位置
然后逆向出页面模板
因为这些页面都是模板生成的, 于是对整站套用模板, ok, 数据出来了.
8楼(未知网友)
# python框架tornado官方文档爬虫示例
import time
from datetime import timedelta
try:
from HTMLParser import HTMLParser
from urlparse import urljoin, urldefrag
except ImportError:
from html.parser import HTMLParser
from urllib.parse import urljoin, urldefrag
from tornado import httpclient, gen, ioloop, queues
base_url = 'http://www.tornadoweb.org/en/stable/'
concurrency = 10
@gen.coroutine
def get_links_from_url(url):
"""Download the page at `url` and parse it for links.
Returned links have had the fragment after `#` removed, and have been made
absolute so, e.g. the URL 'gen.html#tornado.gen.coroutine' becomes
'http://www.tornadoweb.org/en/stable/gen.html'.
"""
try:
response = yield httpclient.AsyncHTTPClient().fetch(url)
print('fetched %s' % url)
html = response.body if isinstance(response.body, str) \
else response.body.decode()
urls = [urljoin(url, remove_fragment(new_url))
for new_url in get_links(html)]
except Exception as e:
print('Exception: %s %s' % (e, url))
raise gen.Return([])
raise gen.Return(urls)
def remove_fragment(url):
pure_url, frag = urldefrag(url)
return pure_url
def get_links(html):
class URLSeeker(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.urls = []
def handle_starttag(self, tag, attrs):
href = dict(attrs).get('href')
if href and tag == 'a':
self.urls.append(href)
url_seeker = URLSeeker()
url_seeker.feed(html)
return url_seeker.urls
@gen.coroutine
def main():
q = queues.Queue()
start = time.time()
fetching, fetched = set(), set()
@gen.coroutine
def fetch_url():
current_url = yield q.get()
try:
if current_url in fetching:
return
print('fetching %s' % current_url)
fetching.add(current_url)
urls = yield get_links_from_url(current_url)
fetched.add(current_url)
for new_url in urls:
# Only follow links beneath the base URL
if new_url.startswith(base_url):
yield q.put(new_url)
finally:
q.task_done()
@gen.coroutine
def worker():
while True:
yield fetch_url()
q.put(base_url)
# Start workers, then wait for the work queue to be empty.
for _ in range(concurrency):
worker()
yield q.join(timeout=timedelta(seconds=300))
assert fetching == fetched
print('Done in %d seconds, fetched %s URLs.' % (
time.time() - start, len(fetched)))
if __name__ == '__main__':
import logging
logging.basicConfig()
io_loop = ioloop.IOLoop.current()
io_loop.run_sync(main)
9楼(未知网友)
这几天写了一个爬虫,这是我关于反爬虫的一些总结: 常见的反爬虫和应对方法 - Python Hacker - 知乎专栏
刚开始写爬虫用的是urllib2,后来知道了requests,惊为天人。
刚开始解析网页用的是re,后来知道了BeautifulSoup,解析页面不能再轻松。
再后来看别人的爬虫,知道了scrapy,被这个框架惊艳到了。
之后遇到了一些有验证码的网站,于是知道了PIL。但后来知道了opencv,pybrain。当在爬虫中用上人工神经网络识别出验证码,兴奋得守在爬虫旁边看他爬完全站。
再后来知道了threading,知道了celery。
不断的学习,不断的接触和知道更多的东西,爬虫与反爬虫的对抗会一直进行下去。