如今,网上的爬虫教程可谓是泛滥成灾了,从urllib开始讲,最后才讲到requests和selenium这类高级库,实际上,根本就不必这么费心地去了解这么多无谓的东西的。只需记住爬虫总共就三大步骤:发起请求——解析数据——存储数据,这样就足以写出最基本的爬虫了。诸如像Scrapy这样的框架,可以说是集成了爬虫的一切,但是新人可能会用的不怎么顺手,看教程可能还会踩各种各样的坑,而且Scrapy本身体积也有点大。因此,本人决定亲手写一个轻量级的爬虫框架———— 如果想要看更多的爬虫例子,猛戳这里(里面有惊喜哦) 如果你想迅速撸出一个爬虫,那么你可以用looter提供的模板来自动生成一个 在这行代码中,tmpl是模板,分为data和image两种模板。 async是一个备用的选项,它使得生成的爬虫核心用asyncio而非线程池。 在生成的模板中,你可以自定义domain和tasklist这两个变量。 什么是tasklist?实际上它就是你想要抓取的页面的所有链接。 以 然后你就要定制你的crawl函数,这是爬虫的核心部分。 在大多数情况下,你所要抓取的内容是一个列表(也就是HTML中的ul或ol标签),可以用css选择器将它们保存为items变量。 然后,你只需使用for循环来迭代它们,并抽取你想要的数据,将它们存储到dict中。 但是,在你写完这个爬虫之前,最好用looter提供的shell来调试一下你的cssselect代码是否正确。(目前已集成 调试完成后,你的爬虫自然也就完成了。怎么样,是不是很简单:) looter为用户提供了很多实用的函数。 在爬取页面前,你最好确认一下页面的渲染是否是你想要的 当你获取了一堆图片链接时,用它可以直接将它们保存到本地 可以获取网站的reach和popularity指数(人气度),此函数返回一个元组(url, reach_rank, popularity_rank) 获取网页的所有链接 同样地,你也可以用正则表达式来获取匹配的链接 将所得结果保存为json文件,支持按键值排序 用于爬取网站robots.txt上的所有链接。这个在做全站爬虫或者递归式url爬虫时颇为有效 有一些网站必须要先登录才能爬取,于是就有了login函数,本质其实就是建立session会话向服务器发送带有data的POST请求。 考验各位抓包的能力,以下为模拟登录网易126邮箱(要求参数:postdata和param) 延迟爬取:time.sleep(n) 代理IP池:scylla 动态JS网页:requestium或抓包 模拟登陆:fuck-login 验证码:Tesseract、OpenCV、Keras、打码平台 有时候,仅仅爬取数据存到数据库里是不够的。如果想把数据开放出去,就需要搭建api。一旦建成,你就可以以网页、app甚至是微信小程序的形式来向他人展现和使用你的数据了。 利用一个叫eve的框架,我们就能迅速搭建出我们的api 假设你已经利用爬虫爬取到了jav的数据并存入了MongoDB数据库中,那么搭建api就只需创建2个文件:一个是api的站点文件(本质上是一个flask的app实例),另一个是api的配置文件。 jav_api.py jav_settings.py工作流
$ looter genspider <name> <tmpl> [--async]
def crawl(url):
tree = lt.fetch(url)
items = tree.cssselect('ul li') for item in items:
data = dict() # data[...] = item.cssselect(...)
pprint(data)
函数
view
>>> view(url)
save_imgs
>>> img_urls = [...]>>> save_imgs(img_urls)
alexa_rank
>>> alexa_rank(url)
links
>>> links(res) # 获取所有链接>>> links(res, absolute=True) # 获取绝对链接>>> links(res, search='text') # 查找指定链接
>>> re_links(res, r'regex_pattern')
save_as_json
>>> total = [...]>>> save_as_json(total, name='text', sort_by='key')
parse_robots
>>> parse_robots(url)
login
>>> params = {'df': 'mail126_letter', 'from': 'web', 'funcid': 'loginone', 'iframe': '1', 'language': '-1', 'passtype': '1', 'product': 'mail126', 'verifycookie': '-1', 'net': 'failed', 'style': '-1', 'race': '-2_-2_-2_db', 'uid': 'webscraping123@126.com', 'hid': '10010102'}>>> postdata = {'username': 你的用户名, 'savelogin': '1', 'url2': 'http://mail.126.com/errorpage/error126.htm', 'password': 你的密码}>>> url = "https://mail.126.com/entry/cgi/ntesdoor?">>> res, ses = login(url, postdata, params=params) # res为post请求后的页面,ses为请求会话>>> index_url = re.findall(r'href = "(.*?)"', res.text)[0] # 在res中获取重定向主页的链接>>> index = ses.get(index_url) # 用ses会话访问重定向链接,想确认成功的话print下即可
防反爬虫技巧
api搭建
$ pip install eve
from eve import Eve
app = Eve(settings='jav_settings.py')if __name__ == '__main__':
app.run()
# validation rules: http://docs.python-cerberus.org/en/stable/validation-rules.htmljav = { 'datasource': { 'source': 'torrents', 'default_sort': [('date', -1)]
}
}
ALLOW_UNKNOWN = TrueDOMAIN = {'jav': jav}
MONGO_DBNAME = 'jav'MONGO_QUERY_BLACKLIST = ['$where']
RENDERERS = ['eve.render.JSONRenderer']
http://127.0.0.1:5000/jav?where={"name":{"$regex":"波多"}}
作者:Python小哥哥
链接:https://www.jianshu.com/p/cc1d39dab531
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章