精华内容
下载资源
问答
  • 如何用Python爬数据?(一)网页抓取你期待已久的Python网络数据爬虫教程来了。本文为你演示如何从网页里找到感兴趣的链接和说明文字,抓取并存储到Excel。需求我在公众号后台,经常可以收到读者的留言。很多留言,...

    如何用Python爬数据?(一)网页抓取

    你期待已久的Python网络数据爬虫教程来了。本文为你演示如何从网页里找到感兴趣的链接和说明文字,抓取并存储到Excel。

    2018-03-03-21-45-09-792876.png

    需求

    我在公众号后台,经常可以收到读者的留言。

    很多留言,是读者的疑问。只要有时间,我都会抽空尝试解答。

    但是有的留言,乍看起来就不明所以了。

    例如下面这个:

    2018-03-03-19-05-09-970402.png

    一分钟后,他可能觉得不妥(大概因为想起来,我用简体字写文章),于是又用简体发了一遍。

    2018-03-03-18-43-47-865706.png

    我恍然大悟。

    这位读者以为我的公众号设置了关键词推送对应文章功能。所以看了我的其他数据科学教程后,想看"爬虫”专题。

    不好意思,当时我还没有写爬虫文章。

    而且,我的公众号暂时也没有设置这种关键词推送。

    主要是因为我懒。

    这样的消息接收得多了,我也能体察到读者的需求。不止一个读者表达出对爬虫教程的兴趣。

    之前提过,目前主流而合法的网络数据收集方法,主要分为3类:

    开放数据集下载;

    API读取;

    爬虫。

    前两种方法,我都已经做过一些介绍,这次说说爬虫。

    2018-03-04-07-11-31-258650.png

    概念

    许多读者对爬虫的定义,有些混淆。咱们有必要辨析一下。

    维基百科是这么说的:

    网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。

    这问题就来了,你又不打算做搜索引擎,为什么对网络爬虫那么热心呢?

    其实,许多人口中所说的爬虫(web crawler),跟另外一种功能"网页抓取”(web scraping)搞混了。

    维基百科上,对于后者这样解释:

    Web scraping, web harvesting, or web data extraction is data scraping used for extracting data from websites. Web scraping software may access the World Wide Web directly using the Hypertext Transfer Protocol, or through a web browser.

    看到没有,即便你用浏览器手动拷贝数据下来,也叫做网页抓取(web scraping)。是不是立刻觉得自己强大了很多?

    但是,这定义还没完:

    While web scraping can be done manually by a software user, the term typically refers to automate processes implemented using a bot or web crawler.

    也就是说,用爬虫(或者机器人)自动替你完成网页抓取工作,才是你真正想要的。

    数据抓下来干什么呢?

    一般是先存储起来,放到数据库或者电子表格中,以备检索或者进一步分析使用。

    所以,你真正想要的功能是这样的:

    找到链接,获得Web页面,抓取指定信息,存储。

    这个过程有可能会往复循环,甚至是滚雪球。

    你希望用自动化的方式来完成它。

    了解了这一点,你就不要老盯着爬虫不放了。爬虫研制出来,其实是为了给搜索引擎编制索引数据库使用的。你为了抓取点儿数据拿来使用,已经是大炮轰蚊子了。

    要真正掌握爬虫,你需要具备不少基础知识。例如HTML, CSS, Javascript, 数据结构……

    这也是为什么我一直犹豫着没有写爬虫教程的原因。

    不过这两天,看到王烁主编的一段话,很有启发:

    我喜欢讲一个另类二八定律,就是付出两成努力,了解一件事的八成。

    既然我们的目标很明确,就是要从网页抓取数据。那么你需要掌握的最重要能力,是拿到一个网页链接后,如何从中快捷有效地抓取自己想要的信息。

    掌握了它,你还不能说自己已经学会了爬虫。

    但有了这个基础,你就能比之前更轻松获取数据了。特别是对"文科生”的很多应用场景来说,非常有用。这就是赋能。

    而且,再进一步深入理解爬虫的工作原理,也变得轻松许多。

    这也算"另类二八定律”的一个应用吧。

    Python语言的重要特色之一,就是可以利用强大的软件工具包(许多都是第三方提供)。你只需要编写简单的程序,就能自动解析网页,抓取数据。

    本文给你演示这一过程。

    目标

    要抓取网页数据,我们先制订一个小目标。

    目标不能太复杂。但是完成它,应该对你理解抓取(Web Scraping)有帮助。

    就选择我最近发布的一篇简书文章作为抓取对象好了。题目叫做《如何用《玉树芝兰》入门数据科学?》。

    2018-03-03-18-43-47-962316.png

    这篇文章里,我把之前的发布的数据科学系列文章做了重新组织和串讲。

    文中包含很多之前教程的标题和对应链接。例如下图红色边框圈起来的部分。

    2018-03-03-18-43-47-927654.png

    假设你对文中提到教程都很感兴趣,希望获得这些文章的链接,并且存储到Excel里,就像下面这个样子:

    2018-03-03-18-43-47-936213.png

    你需要把非结构化的分散信息(自然语言文本中的链接),专门提取整理,并且存储下来。

    该怎么办呢?

    即便不会编程,你也可以全文通读,逐个去找这些文章链接,手动把文章标题、链接都分别拷贝下来,存到Excel表里面。

    但是,这种手工采集方法没有效率。

    我们用Python。

    环境

    要装Python,比较省事的办法是安装Anaconda套装。

    请到这个网址下载Anaconda的最新版本。

    2018-03-03-21-45-09-801080.png

    请选择左侧的 Python 3.6 版本下载安装。

    如果你需要具体的步骤指导,或者想知道Windows平台如何安装并运行Anaconda命令,请参考我为你准备的视频教程。

    安装好Anaconda之后,请到这个网址下载本教程配套的压缩包。

    下载后解压,你会在生成的目录(下称"演示目录”)里面看到以下三个文件。

    2018-03-03-21-45-09-801703.png

    打开终端,用cd命令进入该演示目录。如果你不了解具体使用方法,也可以参考视频教程。

    我们需要安装一些环境依赖包。

    首先执行:

    pip install pipenv

    这里安装的,是一个优秀的 Python 软件包管理工具 pipenv 。

    安装后,请执行:

    pipenv install

    看到演示目录下两个Pipfile开头的文件了吗?它们就是 pipenv 的设置文档。

    pipenv 工具会依照它们,自动为我们安装所需要的全部依赖软件包。

    2018-03-03-21-45-09-803003.png

    上图里面有个绿色的进度条,提示所需安装软件数量和实际进度。

    装好后,根据提示我们执行:

    pipenv shell

    此处请确认你的电脑上已经安装了 Google Chrome 浏览器。

    我们执行:

    jupyter notebook

    默认浏览器(Google Chrome)会开启,并启动 Jupyter 笔记本界面:

    2018-03-03-21-45-09-804222.png

    你可以直接点击文件列表中的第一项ipynb文件,可以看到本教程的全部示例代码。

    你可以一边看教程的讲解,一边依次执行这些代码。

    2018-03-03-21-45-09-805922.png

    但是,我建议的方法,是回到主界面下,新建一个新的空白 Python 3 笔记本。

    2018-03-03-21-45-09-806907.png

    请跟着教程,一个个字符输入相应的内容。这可以帮助你更为深刻地理解代码的含义,更高效地把技能内化。

    2018-03-03-21-45-09-807766.png

    准备工作结束,下面我们开始正式输入代码。

    代码

    读入网页加以解析抓取,需要用到的软件包是 requests_html 。我们此处并不需要这个软件包的全部功能,只读入其中的 HTMLSession 就可以。

    from requests_html import HTMLSession

    然后,我们建立一个会话(session),即让Python作为一个客户端,和远端服务器交谈。

    session = HTMLSession()

    前面说了,我们打算采集信息的网页,是《如何用《玉树芝兰》入门数据科学?》一文。

    我们找到它的网址,存储到url变量名中。

    url = 'https://www.jianshu.com/p/85f4624485b9'

    下面的语句,利用 session 的 get 功能,把这个链接对应的网页整个儿取回来。

    r = session.get(url)

    网页里面都有什么内容呢?

    我们告诉Python,请把服务器传回来的内容当作HTML文件类型处理。我不想要看HTML里面那些乱七八糟的格式描述符,只看文字部分。

    于是我们执行:

    print(r.html.text)

    这就是获得的结果了:

    2018-03-03-16-24-21-140063.png

    我们心里有数了。取回来的网页信息是正确的,内容是完整的。

    好了,我们来看看怎么趋近自己的目标吧。

    我们先用简单粗暴的方法,尝试获得网页中包含的全部链接。

    把返回的内容作为HTML文件类型,我们查看 links 属性:

    r.html.links

    这是返回的结果:

    2018-03-03-16-26-25-059092.png

    这么多链接啊!

    很兴奋吧?

    不过,你发现没有?这里许多链接,看似都不完全。例如第一条结果,只有:

    '/'

    这是什么东西?是不是链接抓取错误啊?

    不是,这种看着不像链接的东西,叫做相对链接。它是某个链接,相对于我们采集的网页所在域名(https://www.jianshu.com)的路径。

    这就好像我们在国内邮寄快递包裹,填单子的时候一般会写"XX省XX市……”,前面不需要加上国家名称。只有国际快递,才需要写上国名。

    但是如果我们希望获得全部可以直接访问的链接,怎么办呢?

    很容易,也只需要一条 Python 语句。

    r.html.absolute_links

    这里,我们要的是"绝对”链接,于是我们就会获得下面的结果:

    2018-03-03-16-31-15-237773.png

    这回看着是不是就舒服多了?

    我们的任务已经完成了吧?链接不是都在这里吗?

    链接确实都在这里了,可是跟我们的目标是不是有区别呢?

    检查一下,确实有。

    我们不光要找到链接,还得找到链接对应的描述文字呢,结果里包含吗?

    没有。

    结果列表中的链接,都是我们需要的吗?

    不是。看长度,我们就能感觉出许多链接并不是文中描述其他数据科学文章的网址。

    这种简单粗暴直接罗列HTML文件中所有链接的方法,对本任务行不通。

    那么我们该怎么办?

    我们得学会跟 Python 说清楚我们要找的东西。这是网页抓取的关键。

    想想看,如果你想让助手(人类)帮你做这事儿,怎么办?

    你会告诉他:

    "寻找正文中全部可以点击的蓝色文字链接,拷贝文字到Excel表格,然后右键复制对应的链接,也拷贝到Excel表格。每个链接在Excel占一行,文字和链接各占一个单元格。”

    虽然这个操作执行起来麻烦,但是助手听懂后,就能帮你执行。

    同样的描述,你试试说给电脑听……不好意思,它不理解。

    因为你和助手看到的网页,是这个样子的。

    2018-03-03-16-42-24-952435.png

    电脑看到的网页,是这个样子的。

    2018-03-03-16-43-10-688894.png

    为了让你看得清楚源代码,浏览器还特意对不同类型的数据用了颜色区分,对行做了编号。

    数据显示给电脑时,上述辅助可视功能是没有的。它只能看见一串串字符。

    那可怎么办?

    仔细观察,你会发现这些HTML源代码里面,文字、图片链接内容前后,都会有一些被尖括号括起来的部分,这就叫做"标记”。

    所谓HTML,就是一种标记语言(超文本标记语言,HyperText Markup Language)。

    标记的作用是什么?它可以把整个的文件分解出层次来。

    2018-03-03-17-06-49-630506.png

    如同你要发送包裹给某个人,可以按照"省-市-区-街道-小区-门牌”这样的结构来写地址,快递员也可以根据这个地址找到收件人。

    同样,我们对网页中某些特定内容感兴趣,可以依据这些标记的结构,顺藤摸瓜找出来。

    这是不是意味着,你必须先学会HTML和CSS,才能进行网页内容抓取呢?

    不是的,我们可以借助工具,帮你显著简化任务复杂度。

    这个工具,Google Chrome浏览器自带。

    我们在样例文章页面上,点击鼠标右键,在出现的菜单里面选择"检查”。

    2018-03-03-17-11-50-177393.png

    这时,屏幕下方就会出现一个分栏。

    2018-03-03-17-13-12-436452.png

    我们点击这个分栏左上角(上图红色标出)的按钮。然后把鼠标悬停在第一个文内链接(《玉树芝兰》)上面,点击一下。

    2018-03-03-17-14-22-049544.png

    此时,你会发现下方分栏里面,内容也发生了变化。这个链接对应的源代码被放在分栏区域正中,高亮显示。

    2018-03-03-17-16-04-532914.png

    确认该区域就是我们要找的链接和文字描述后,我们鼠标右键选择高亮区域,并且在弹出的菜单中,选择 Copy -> Copy selector。

    2018-03-03-17-17-45-788878.png

    找一个文本编辑器,执行粘贴,就可以看见我们究竟复制下来了什么内容。

    body > div.note > div.post > div.article > div.show-content > div > p:nth-child(4) > a

    这一长串的标记,为电脑指出了:请你先找到 body 标记,进入它管辖的这个区域后去找 div.note 标记,然后找……最后找到 a 标记,这里就是要找的内容了。

    回到咱们的 Jupyter Notebook 中,用刚才获得的标记路径,定义变量sel。

    sel = 'body > div.note > div.post > div.article > div.show-content > div > p:nth-child(4) > a'

    我们让 Python 从返回内容中,查找 sel 对应的位置,把结果存到 results 变量中。

    results = r.html.find(sel)

    我们看看 results 里面都有什么。

    results

    这是结果:

    []

    results 是个列表,只包含一项。这一项包含一个网址,就是我们要找的第一个链接(《玉树芝兰》)对应的网址。

    可是文字描述"《玉树芝兰》”哪里去了?

    别着急,我们让 Python 显示 results 结果数据对应的文本。

    results[0].text

    这是输出结果:

    '玉树芝兰'

    我们把链接也提取出来:

    results[0].absolute_links

    显示的结果却是一个集合。

    {'https://www.jianshu.com/nb/130182'}

    我们不想要集合,只想要其中的链接字符串。所以我们先把它转换成列表,然后从中提取第一项,即网址链接。

    list(results[0].absolute_links)[0]

    这次,终于获得我们想要的结果了:

    'https://www.jianshu.com/nb/130182'

    有了处理这第一个链接的经验,你信心大增,是吧?

    其他链接,也无非是找到标记路径,然后照猫画虎嘛。

    可是,如果每找一个链接,都需要手动输入上面这若干条语句,那也太麻烦了。

    这里就是编程的技巧了。重复逐条运行的语句,如果工作顺利,我们就要尝试把它们归并起来,做个简单的函数。

    对这个函数,只需给定一个选择路径(sel),它就把找到的所有描述文本和链接路径都返回给我们。

    def get_text_link_from_sel(sel):

    mylist = []

    try:

    results = r.html.find(sel)

    for result in results:

    mytext = result.text

    mylink = list(result.absolute_links)[0]

    mylist.append((mytext, mylink))

    return mylist

    except:

    return None

    我们测试一下这个函数。

    还是用刚才的标记路径(sel)不变,试试看。

    print(get_text_link_from_sel(sel))

    输出结果如下:

    [('玉树芝兰', 'https://www.jianshu.com/nb/130182')]

    没问题,对吧?

    好,我们试试看第二个链接。

    我们还是用刚才的方法,使用下面分栏左上角的按钮点击第二个链接。

    2018-03-03-17-34-07-255683.png

    下方出现的高亮内容就发生了变化:

    2018-03-03-17-33-33-680068.png

    我们还是用鼠标右键点击高亮部分,拷贝出 selector。

    2018-03-03-17-35-02-842966.png

    然后我们直接把获得的标记路径写到 Jupyter Notebook 里面。

    sel = 'body > div.note > div.post > div.article > div.show-content > div > p:nth-child(6) > a'

    用我们刚才编制的函数,看看输出结果是什么?

    print(get_text_link_from_sel(sel))

    输出如下:

    [('如何用Python做词云?', 'https://www.jianshu.com/p/e4b24a734ccc')]

    检验完毕,函数没有问题。

    下一步做什么?

    你还打算去找第三个链接,仿照刚才的方法做?

    那你还不如全文手动摘取信息算了,更省事儿一些。

    我们要想办法把这个过程自动化。

    对比一下刚刚两次我们找到的标记路径:

    body > div.note > div.post > div.article > div.show-content > div > p:nth-child(4) > a

    以及:

    body > div.note > div.post > div.article > div.show-content > div > p:nth-child(6) > a

    发现什么规律没有?

    对,路径上其他的标记全都是一样的,唯独倒数第二个标记("p")后冒号后内容有区别。

    这就是我们自动化的关键了。

    上述两个标记路径里面,因为指定了在第几个"子”(nth-child)文本段(paragraph,也就是"p"代表的含义)去找"a"这个标记,因此只返回来单一结果。

    如果我们不限定"p"的具体位置信息呢?

    我们试试看,这次保留标记路径里面其他全部信息,只修改"p"这一点。

    sel = 'body > div.note > div.post > div.article > div.show-content > div > p > a'

    再次运行我们的函数:

    print(get_text_link_from_sel(sel))

    这是输出结果:

    2018-03-04-07-48-38-603409.png

    好了,我们要找的内容,全都在这儿了。

    但是,我们的工作还没完。

    我们还得把采集到的信息输出到Excel中保存起来。

    还记得我们常用的数据框工具 Pandas 吗?又该让它大显神通了。

    import pandas as pd

    只需要这一行命令,我们就能把刚才的列表变成数据框:

    df = pd.DataFrame(get_text_link_from_sel(sel))

    让我们看看数据框内容:

    df

    2018-03-03-17-54-03-439993.png

    内容没问题,不过我们对表头不大满意,得更换为更有意义的列名称:

    df.columns = ['text', 'link']

    再看看数据框内容:

    df

    2018-03-03-17-55-02-015623.png

    好了,下面就可以把抓取的内容输出到Excel中了。

    Pandas内置的命令,就可以把数据框变成csv格式,这种格式可以用Excel直接打开查看。

    df.to_csv('output.csv', encoding='gbk', index=False)

    注意这里需要指定encoding(编码)为gbk,否则默认的utf-8编码在Excel中查看的时候,有可能是乱码。

    我们看看最终生成的csv文件吧。

    2018-03-03-17-58-17-057507.png

    很有成就感,是不是?

    小结

    本文为你展示了用Python自动网页抓取的基础技能。希望阅读并动手实践后,你能掌握以下知识点:

    网页抓取与网络爬虫之间的联系与区别;

    如何用 pipenv 快速构建指定的 Python 开发环境,自动安装好依赖软件包;

    如何用 Google Chrome 的内置检查功能,快速定位感兴趣内容的标记路径;

    如何用 requests-html 包来解析网页,查询获得需要的内容元素;

    如何用 Pandas 数据框工具整理数据,并且输出到 Excel。

    或许,你觉得这篇文章过于浅白,不能满足你的要求。

    文中只展示了如何从一个网页抓取信息,可你要处理的网页成千上万啊。

    别着急。

    本质上说,抓取一个网页,和抓取10000个网页,在流程上是一样的。

    而且,从咱们的例子里,你是不是已经尝试了抓取链接?

    有了链接作为基础,你就可以滚雪球,让Python爬虫"爬”到解析出来的链接上,做进一步的处理。

    将来,你可能还要应对实践场景中的一些棘手问题:

    如何把抓取的功能扩展到某一范内内的所有网页?

    如何爬取Javascript动态网页?

    假设你爬取的网站对每个IP的访问频率做出限定,怎么办?

    ……

    这些问题的解决办法,我希望在今后的教程里面,一一和你分享。

    需要注意的是,网络爬虫抓取数据,虽然功能强大,但学习与实践起来有一定门槛。

    当你面临数据获取任务时,应该先检查一下这个清单:

    有没有别人已经整理好的数据集合可以直接下载?

    网站有没有对你需要的数据提供API访问与获取方式?

    有没有人针对你的需求,编好了定制爬虫,供你直接调用?

    如果答案是都没有,才需要你自己编写脚本,调动爬虫来抓取。

    为了巩固学习的知识,请你换一个其他网页,以咱们的代码作为基础修改后,抓取其中你感兴趣的内容。

    如果能把你抓取的过程记录下来,在评论区将记录链接分享给大家,就更好了。

    因为刻意练习是掌握实践技能的最好方式,而教是最好的学。

    祝顺利!

    思考

    本文主要内容讲解完毕。

    这里给你提一个疑问,供你思考:

    我们解析并且存储的链接,其实是有重复的:

    2018-03-03-18-18-24-726975.png

    这并不是我们的代码有误,而是在《如何用《玉树芝兰》入门数据科学?》一文里,本来就多次引用过一些文章,所以重复的链接就都被抓取出来了。

    但是你存储的时候,也许不希望保留重复链接。

    这种情况下,你该如何修改代码,才能保证抓取和保存的链接没有重复呢?

    我把这一部分内容,放到了文末的付费阅读区域。如果你愿意支持我的数据科学系列教程写作,顺便核对一下你的代码是不是比我的更高效,只需支付2块钱(推广期价格),阅读该部分内容。

    讨论

    你对Python爬虫感兴趣吗?在哪些数据采集任务上使用过它?有没有其他更高效的方式,来达成数据采集目的?欢迎留言,把你的经验和思考分享给大家,我们一起交流讨论。

    如果你对我的文章感兴趣,欢迎点赞,并且微信关注和置顶我的公众号"玉树芝兰”(nkwangshuyi)。

    如果本文可能对你身边的亲友有帮助,也欢迎你把本文通过微博或朋友圈分享给他们。让他们一起参与到我们的讨论中来。

    展开全文
  • 在本篇文章里小编给大家整理的是一篇关于python爬虫数据保存到mongoDB的实例方法,有需要的朋友们可以参考下。
  • WechatSogou [1]- 微信公众号爬虫...可以下豆瓣读书标签下的所有图书,按评分排名依次存储,存储到Excel中,可方便大家筛选搜罗,比如筛选评价人数>1000的高分书籍;可依据不同的主题存储到Excel不同的Sheet ,采...

    WechatSogou [1]- 微信公众号爬虫。基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典。

    DouBanSpider [2]- 豆瓣读书爬虫。可以爬下豆瓣读书标签下的所有图书,按评分排名依次存储,存储到Excel中,可方便大家筛选搜罗,比如筛选评价人数>1000的高分书籍;可依据不同的主题存储到Excel不同的Sheet ,采用User Agent伪装为浏览器进行爬取,并加入随机延时来更好的模仿浏览器行为,避免爬虫被封。

    zhihu_spider [3]- 知乎爬虫。此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo

    bilibili-user [4]- Bilibili用户爬虫。总数据数:20119918,抓取字段:用户id,昵称,性别,头像,等级,经验值,粉丝数,生日,地址,注册时间,签名,等级与经验值等。抓取之后生成B站用户数据报告。

    SinaSpider [5]- 新浪微博爬虫。主要爬取新浪微博用户的个人信息、微博信息、粉丝和关注。代码获取新浪微博Cookie进行登录,可通过多账号登录来防止新浪的反扒。主要使用 scrapy 爬虫框架。

    distribute_crawler [6]- 小说下载分布式爬虫。使用scrapy,Redis, MongoDB,graphite实现的一个分布式网络爬虫,底层存储mongodb集群,分布式使用redis实现,爬虫状态显示使用graphite实现,主要针对一个小说站点。

    CnkiSpider [7]- 中国知网爬虫。设置检索条件后,执行src/CnkiSpider.py抓取数据,抓取数据存储在/data目录下,每个数据文件的第一行为字段名称。

    LianJiaSpider [8]- 链家网爬虫。爬取北京地区链家历年二手房成交记录。涵盖链家爬虫一文的全部代码,包括链家模拟登录代码。

    scrapy_jingdong [9]- 京东爬虫。基于scrapy的京东网站爬虫,保存格式为csv。

    QQ-Groups-Spider [10]- QQ 群爬虫。批量抓取 QQ 群信息,包括群名称、群号、群人数、群主、群简介等内容,最终生成 XLS(X) / CSV 结果文件。

    wooyun_public[11]-乌云爬虫。 乌云公开漏洞、知识库爬虫和搜索。全部公开漏洞的列表和每个漏洞的文本内容存在mongodb中,大概约2G内容;如果整站爬全部文本和图片作为离线查询,大概需要10G空间、2小时(10M电信带宽);爬取全部知识库,总共约500M空间。漏洞搜索使用了Flask作为web server,bootstrap作为前端。

    QunarSpider [12]- 去哪儿网爬虫。 网络爬虫之Selenium使用代理登陆:爬取去哪儿网站,使用selenium模拟浏览器登陆,获取翻页操作。代理可以存入一个文件,程序读取并使用。支持多进程抓取。

    findtrip [13]- 机票爬虫(去哪儿和携程网)。Findtrip是一个基于Scrapy的机票爬虫,目前整合了国内两大机票网站(去哪儿 + 携程)。

    163spider [14] - 基于requests、MySQLdb、torndb的网易客户端内容爬虫

    doubanspiders[15]- 豆瓣电影、书籍、小组、相册、东西等爬虫集

    QQSpider [16]- QQ空间爬虫,包括日志、说说、个人信息等,一天可抓取 400 万条数据。

    baidu-music-spider [17]- 百度mp3全站爬虫,使用redis支持断点续传。

    tbcrawler[18]- 淘宝和天猫的爬虫,可以根据搜索关键词,物品id来抓去页面的信息,数据存储在mongodb。

    stockholm [19]- 一个股票数据(沪深)爬虫和选股策略测试框架。根据选定的日期范围抓取所有沪深两市股票的行情数据。支持使用表达式定义选股策略。支持多线程处理。保存数据到JSON文件、CSV文件。

    展开全文
  • 爬虫三步走包括爬取数据、解析数据和保存数据Python强大之处就是每一步都提供了强大的库,我们只要使用对应的库,就能把网站中想要的数据爬取下来。第一步爬取数据,最常用的就是Requests库。Requests库主要的功能...

    爬虫三步走包括爬取数据、解析数据和保存数据,Python强大之处就是每一步都提供了强大的库,我们只要使用对应的库,就能把网站中想要的数据爬取下来。第一步爬取数据,最常用的就是Requests库。Requests库主要的功能是模拟浏览器向网站发起HTTP请求,把整个网页的HTML代码爬取下来,下面介绍下Requests库的使用流程。

    安装

    导入

    主要方法

    一个HTTP请求通常包括URL和请求方法,URL指的是统一资源定位符,可以理解成一个网络上的资源;而常用的请求方法有get、post、put、delete、patch,分别代表对资源的获取、创建、创建和更新、删除、部分更新。head指只获取头信息。

    一个HTTP方法有安全和幂等两个属性,其中安全指的是不修改资源的HTTP方法;幂等指的是无论调用多少次,结果仍然相同。

    下面是一些常用的HTTP方法的安全性和幂等性:

    更详细的可查看: RESTful手册

    使用

    返回

    更多状态码查看: HTTP状态码

    封装通用方法

    定义函数

    设置超时

    异常处理

    参数和headers

    一般网页的反爬机制是通过检查请求头信息实现的,当发现要爬取的网页headers跟一般的请求头不一致时,我们需要添加headers来达到模拟浏览器发起请求,才能成功获取数据。有时候也需要传参数,比如翻页参数等。

    常见的请求头

    Accept:

    Accept-Encoding:

    Accept-Language:

    Connection:

    Cookie:

    Host:

    Referer:

    User-Agent:

    爬虫协议

    搜索引擎的蜘蛛机器人(spider)对网站进行爬行并索引网页,并随后通过关键字搜索为网站带来流量,但是有些私密的或是不适宜公开的信息或数据不希望被爬取,这时候就需要robots.txt了,通过它对搜索引擎给予指示,限制搜索引擎对特定内容的访问。

    什么是爬虫协议:告诉爬虫机器人哪些页面可以抓取,哪些页面不可以抓取

    如何查看爬虫协议:在网站根域名后加上robots.txt,如淘宝的爬虫协议:https://www.taobao.com/robots.txt

    了解更多爬虫协议: robots协议

    robots.txt语法:

    robots.txt实例:

    需要注意的是:

    如果指定了某个机器人的规则,对于所有机器人的规则对该机器人就不起作用。

    robots.txt 不是命令,也不是防火墙,只是一个"君子协议”, 无法阻止恶意闯入。

    下一篇将会进行实战,爬取一些知名的网站。看看它们的反爬机制是怎样的,能不能爬取到我们想要的数据。

    展开全文
  • 这篇文章给大家通过实例讲解了Python爬取网页数据的步骤以及操作过程,有兴趣的朋友跟着学习下吧。 一、利用webbrowser.open()打开一个网站: >>> import webbrowser >>> webbrowser.open('...
  • Python实现爬虫爬取NBA数据功能示例本文实例讲述了Python实现爬虫爬取NBA数据功能。分享给大家供大家参考,具体如下:爬取的网站为:stat-nba.com,这里爬取的是NBA2016-2017赛季常规赛至2017年1月7日的数据改变url_...

    Python实现爬虫爬取NBA数据功能示例

    本文实例讲述了Python实现爬虫爬取NBA数据功能。分享给大家供大家参考,具体如下:

    爬取的网站为:stat-nba.com,这里爬取的是NBA2016-2017赛季常规赛至2017年1月7日的数据

    改变url_header和url_tail即可爬取特定的其他数据。

    源代码如下:

    #coding=utf-8

    import sys

    reload(sys)

    sys.setdefaultencoding('utf-8')

    import requests

    import time

    import urllib

    from bs4 import BeautifulSoup

    import re

    from pyExcelerator import *

    def getURLLists(url_header,url_tail,pages):

    """

    获取所有页面的URL列表

    """

    url_lists = []

    url_0 = url_header+'0'+url_tail

    print url_0

    url_lists.append(url_0)

    for i in range(1,pages+1):

    url_temp = url_header+str(i)+url_tail

    url_lists.append(url_temp)

    return url_lists

    def getNBAAllData(url_lists):

    """

    获取所有2017赛季NBA常规赛数据

    """

    datasets = ['']

    for item in url_lists:

    data1 = getNBASingleData(item)

    datasets.extend(data1)

    #去掉数据里的空元素

    for item in datasets[:]:

    if len(item) == 0:

    datasets.remove(item)

    return datasets

    def getNBASingleData(url):

    """

    获取1个页面NBA常规赛数据

    """

    # url = 'http://stat-nba.com/query_team.php?QueryType=game&order=1&crtcol=date_out&GameType=season&PageNum=3000&Season0=2016&Season1=2017'

    # html = requests.get(url).text

    html = urllib.urlopen(url).read()

    # print html

    soup = BeautifulSoup(html)

    data = soup.html.body.find('tbody').text

    list_data = data.split(' ')

    # with open('nba_data.txt','a') as fp:

    # fp.write(data)

    # for item in list_data[:]:

    # if len(item) == 0:

    # list_data.remove(item)

    return list_data

    def saveDataToExcel(datasets,sheetname,filename):

    book = Workbook()

    sheet = book.add_sheet(sheetname)

    sheet.write(0,0,u'序号')

    sheet.write(0,1,u'球队')

    sheet.write(0,2,u'时间')

    sheet.write(0,3,u'结果')

    sheet.write(0,4,u'主客')

    sheet.write(0,5,u'比赛')

    sheet.write(0,6,u'投篮命中率')

    sheet.write(0,7,u'命中数')

    sheet.write(0,8,u'出手数')

    sheet.write(0,9,u'三分命中率')

    sheet.write(0,10,u'三分命中数')

    sheet.write(0,11,u'三分出手数')

    sheet.write(0,12,u'罚球命中率')

    sheet.write(0,13,u'罚球命中数')

    sheet.write(0,14,u'罚球出手数')

    sheet.write(0,15,u'篮板')

    sheet.write(0,16,u'前场篮板')

    sheet.write(0,17,u'后场篮板')

    sheet.write(0,18,u'助攻')

    sheet.write(0,19,u'抢断')

    sheet.write(0,20,u'盖帽')

    sheet.write(0,21,u'失误')

    sheet.write(0,22,u'犯规')

    sheet.write(0,23,u'得分')

    num = 24

    row_cnt = 0

    data_cnt = 0

    data_len = len(datasets)

    print 'data_len:',data_len

    while(data_cnt< data_len):

    row_cnt += 1

    print '序号:',row_cnt

    for col in range(num):

    # print col

    sheet.write(row_cnt,col,datasets[data_cnt])

    data_cnt += 1

    book.save(filename)

    def writeDataToTxt(datasets):

    fp = open('nba_data.txt','w')

    line_cnt = 1

    for i in range(len(datasets)-1):

    #球队名称对齐的操作:如果球队名字过短或者为76人队是 球队名字后面加两个table 否则加1个table

    if line_cnt % 24 == 2 and len(datasets[i]) < 5 or datasets[i] == u'费城76人':

    fp.write(datasets[i]+' ')

    else:

    fp.write(datasets[i]+' ')

    line_cnt += 1

    if line_cnt % 24 == 1:

    fp.write(' ')

    fp.close()

    if __name__ == "__main__":

    pages = int(1132/150)

    url_header = 'http://stat-nba.com/query_team.php?page='

    url_tail = '&QueryType=game&order=1&crtcol=date_out&GameType=season&PageNum=3000&Season0=2016&Season1=2017#label_show_result'

    url_lists = getURLLists(url_header,url_tail,pages)

    datasets = getNBAAllData(url_lists)

    writeDataToTxt(datasets)

    sheetname = 'nba normal data 2016-2017'

    str_time = time.strftime('%Y-%m-%d',time.localtime(time.time()))

    filename = 'nba_normal_data'+str_time+'.xls'

    saveDataToExcel(datasets,sheetname,filename)

    更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

    希望本文所述对大家Python程序设计有所帮助。

    以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

    展开全文
  • 实例简介】爬取淘宝 天猫网站数据实例截图】【核心代码】# -*- coding: utf-8 -*-#!/usr/bin/env pythonimport datetimeimport urlparseimport socketimport scrapyfrom scrapy.loader.processors import ...
  • python爬虫实例

    2020-10-06 16:31:48
    包含股票数据定向爬虫、淘宝信息定向爬虫、中国大学排名定向爬虫,三则实例,可适用于定向爬虫的练习。https://blog.csdn.net/weixin_43726914/article/details/108210563
  • Python爬虫实例

    千次阅读 2017-09-19 14:28:34
    Python爬虫实例
  • 这篇不考虑复杂情况,放一个读取简单网页数据的小例子:目标数据将ittf网站上这个页面上所有这些选手的超链接保存下来。数据请求真的很喜欢符合人类思维的库,比如requests,如果是要直接拿网页文本,一句话搞定:...
  • WechatSogou [1]- 微信公众号爬虫...可以下豆瓣读书标签下的所有图书,按评分排名依次存储,存储到Excel中,可方便大家筛选搜罗,比如筛选评价人数>1000的高分书籍;可依据不同的主题存储到Excel不同的Sheet ,采...
  • #主程序 DATA=[] for url in urls: page=get_page(url) datas=get_info(page) for data in datas: DATA.append(data) #将所有的数据添加到DATA里 #每次一个网页,保留一个网页的信息
  • like Gecko) Chrome/49.0.2623.87 Safari/537.36', } status = Zabbix(headers=headers) token=input("please input token:") status.func() python脚本文件传参并通过token登录后爬取数据实例 from bs4 import ...
  • Python网络爬虫实例:股票数据定向爬虫 一、功能描述 目标:获取上交所和深交所所有股票的名称和交易信息 输出:保存到文件中 技术路线:requests-bs4-re 二、候选数据网站选择 候选网站: 新浪股票:...
  • python爬虫简单实例

    千次阅读 2018-07-23 10:46:15
    # 解析数据 parser.Parse(content) # 结果字典为每一页的入口代码 return provinces #从哪个页面进入 provinces = get_province_entry( 'http://www.ip138.com/post' ) print(provinces) 爬取结果 ...
  • 同样分工合作的理念,在python分布式爬虫中也得到了应用。我们需要给不同的爬虫分配指令,让它们去分头行动获取同一个网站的数据。那么这些爬虫是怎么分工搜集数据的呢?感兴趣的小伙伴,我们可以通过下面的示例进行...
  • 前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。1 明确目的通过访问天猫的网站,先搜索对应的...找到对应的位置之后就可以进行数据...
  • [Python爬虫实例项目]使用Python3+scrapy+pymysql爬取某电影网站数万条数据到MySQL数据库源码
  • 下面小编就为大家分享一篇Python爬虫实例_城市公交网络站点数据的爬取方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 2提取Facebook的API数据 3自动化登录Linkedin 在线商店Gap 宝马官网爬取Google真实的搜索表单 爬取依赖JavaScript的网站Facebook 爬取典型在线商店Gap 爬取拥有地图接口的宝马官网 1.Google搜索引擎# -...
  • 第1章 网络爬虫概述 11.1 认识网络爬虫 11.1.1 网络爬虫的含义 11.1.2 网络爬虫的主要类型 21.1.3 简单网络爬虫的架构 31.1.4 网络爬虫的应用场景 31.2 Python网络爬虫技术概况 41.2.1 Python中实现...
  • python爬虫实例100例-10个python爬虫入门实例

    千次阅读 多人点赞 2020-10-29 14:47:18
    昨天带伙伴萌学习python爬虫,准备了几个简单的入门实例涉及主要知识点:web是如何交互的requests库的get、post函数的应用response对象的相关函数,属性python文件的打开,保存代码中给出了注释,并且可以直接运行哦...
  • 利用爬虫可以进行数据挖掘,比如可以爬取别人的网页,收集有用的数据进行整合和划分,简单的就是程序爬取网页上的所有图片并保存在自己新建的文件夹内,还有可以社交网站的自拍图,将几十万张的图片合在一起,就...
  • python爬虫知网实例-python爬取知网

    千次阅读 2020-10-30 22:55:57
    广告关闭腾讯云双11爆品提前享,精选热门产品助力上云,云服务器... 设置检索条件后,执行srccnkispider.py抓取数据,抓取数据存储在data目录下...如果整站全部文本和图片作为离线查询,大概需要10g空间、2小时(1...
  • 企查查python爬虫实例

    千次阅读 2020-03-11 14:54:22
    企查查python爬虫实例 前些日子尝试给朋友写了一个查询大批公司的统一社会信用码的爬虫程序,借助了很多网上的帖子,学习很多,现在也分享一下我python程序。 准备python库文件(python 3.7) import ...
  • 聊一聊Python与网络爬虫。 1、爬虫的定义 爬虫:自动抓取互联网数据的程序。 2、爬虫的主要框架 爬虫程序的主要框架如上图所示,爬虫调度端通过URL管理器获取待爬取的URL链接,若URL管理器中存在待爬取的URL链接,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,721
精华内容 11,088
关键字:

如何用python爬数据实例

python 订阅