python编程100例头条-python爬虫演示:以爬取今日头条为例

编者按

众所周知,Python是一门编程语言,操作简洁而清晰、功能专业而强大、入门容易又严谨。2018年,教育部正式将人工智能、物联网、大数据处理划入高中课程,这就意味着,现在的中学生开始就要学习编程语言了,不会点Python,都不好意思说我们是走在时代前沿的人了

Python已广泛应用于大数据、社会网络、数据挖掘、网络爬虫、机器学习、计量经济学等诸多前沿领域,越来越多来自心理学、社会学、经济学、新闻传播学、历史学、艺术学等学科的研究者在用Python开展有趣而富有挑战性的研究议题。显然,编程语言已经在人文社会科学领域显示出了广阔的应用前景。可能我们要问了:对于有计算机编程基础的同学学起来当然不会太费力,而我们人文社科领域的同学呢?学起来会有问题吗?答案是:只要多下一些功夫,一定是可以会哒。

因此,基于人文社科领域的同学对于Python的应用来说,我们不求做个人文社科领域的程序员,我们追求的是将Python这门语言技术应用在我们的研究中。

因此我们推出了“社会科学中的Python应用”系列,将为你系统的描述如何利用Python爬取你想要研究的数据——数据来了以后怎么样用Python来数据清洗,数据处理——数据处理完了以后可以用Python来做哪些可视化?——以及用Python来做诸如文本分析、词频分析、情感分析等等统计分析?——最终形成我们的研究,这样一个系列的研究实现过程。这才是我们关注和强调的!!!

在学习的过程中,如果大家有什么问题,也可以在文末留言,我们会请专业老师解答哦!!

93206bd6dc9942c1be3e485443df768b84405682.jpg

大家好!今天来给大家介绍一下,“爬虫”!

其实这个名词很早就出现在人们的视野中,但是最近发现它的功能太强大了,以至于社会学的小伙伴们都开始觊觎它啦,之后我们会以爬虫、数据清洗、统计这样的思路给大家介绍一个小小的demo,并给大家源码让大家动手尝试啦!是不是很激动呢!

相关软件安装

考虑到非计算机专业的同学平时很少使用Linux系统,本文软件安装和配置以Windows10为主。

我们需要安装Python和scrapy。Python是一款易学易用的脚本语言,scrapy是一个用Python写的开源爬虫框架。Python分为2.x版本和3.x版本,随着时间的推移,越来越多的开发者使用3.x版本的Python写程序,Python官方也会逐渐停止对2.x版本的维护。基于此,本文的Python环境为Python 3.6。安装Python 3.6的方式很简单。浏览器打开https://www.python.org/downloads/,点击“Download Python 3.6.x”,下载完成后打开安装文件根据提示操作即可。接下来我们通过pip安装scrapy。首先右键左下角的Windows徽标,选择“Windows Powershell (管理员)”,打开后,输入pip install scrapy,然后回车即可。

一个简单的demo

首先,在D盘根目录新建一个名为“crawler”的文件夹。双击进入此文件夹,然后按住Shift的同时鼠标右击空白区域,在弹出的菜单中选择“在此处打开Powershell窗口”。接下来,输入scrapy startproject demo然后回车,这句代码创建了一个名为demo的scrapy project。该project的所有文件都存放在demo文件夹下。其中demoscrapy.cfg是scrapy的配置文件,demodemo目录下是一些中间件、管道和爬虫设置等文件,demodemospiders里存放爬虫代码。

我们在spiders目录下新建一个quotes_spider.py文件,在文件里面输入如下代码:

importscrapy

class QuotesSpider(scrapy.Spider):

name = "quotes"

defstart_requests(self):

urls = [

'http://quotes.toscrape.com/page/1/',

'http://quotes.toscrape.com/page/2/',

]

forurlinurls:

yieldscrapy.Request(url=url, callback=self.parse)

defparse(self, response):

filename ='quotes-%s.html'% page

withopen(filename, 'wb') as f:

f.write(response.body)

所有爬虫类都需要继承自scrapy.Spider。QuotesSpider的成员变量name表示爬虫的名字,这里命名为“quotes”。start_requests是爬虫的入口,该函数必须返回一个Request对象的列表或者迭代器。我们在for循环里创建scrapy.Request对象,其中url是Request的网址,callback是回调函数,表示用什么函数来解析网址对应的网页内容,一般固定为self.parse.

接下来,我们需要编写解析函数,即parse。Parse的参数response保存网页内容。这里我们简单地把网页内容保存到本地文件中。

最后,我们运行这个爬虫,看下结果。在crawlerdemo目录下打开Powershell窗口(打开的方法见前文),输入scrapy crawl quotes然后回车。其中scrapy crawl表示运行爬虫,quotes是要运行的爬虫的名字。Powershell窗口会输出一系列调试信息,类似下图

ca53340bbbaa430eb081e93c3a01031d38472059.jpg

crawlerdemo目录下会多出两个文件quotes-1.html和quotes-2.html,爬取下来的网页。

到目前为止,我们介绍了用scrapy编写爬虫的基本步骤,即先创建一个scrapy project,然后在spiders目录下编写爬虫代码,最后通过scrapy crawl运行爬虫。然而,这只是一个简单的demo,很多方面都没有涉及,例如解析网页内容,follow link等。接下来,我们以一个实际的例子讲解这些技术。

今日头条爬虫

在接下来的例子中,我们打算写一个爬虫,爬取今日头条中和关键词“自主招生”相关的。首先我们用浏览器打开https://www.toutiao.com/,在右侧的输入框输入“自主招生”,查看搜索结果。注意到这时浏览器的网址是

https://www.toutiao.com/search/?keyword=%E8%87%AA%E4%B8%BB%E6%8B%9B%E7%94%9F

可以发现头条搜索结果网址的规律是https://www.toutiao.com/search/?keyword=xxxx,这里xxxx是搜索关键词的编码。注意到头条的搜索结果页面不是一次呈现的,而是需要不断下拉加载更多内容,所以需要用到另一个Python包Selenium来模拟这个行为,可以通过pip install selenium来安装。Selenium需要调用浏览器driver,本文使用Edge浏览器,其driver可以在https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/下载,下载完成后将MicrosoftWebDriver.exe放到C:WindowsSystem32目录下。

下面,我们在crawler目录下用scrapy startproject toutiao 创建头条项目。打开toutiaooutiaosettings.py,将ROBOTSTXT_OBEY = True改为ROBOTSTXT_OBEY = False,否则由于头条的robots.txt设置,scrapy将无法爬取头条内容。

因为头条的文章是通过js渲染的,scrapy无法直接处理js,所以在编写spider文件前,我们需要修改中间件文件middlewares.py。

在该文件from scrapy import signals前添加

from selenium import webdriver

from scrapy.http import HtmlResponse

在该文件中的函数process_request中添加相关代码如下:

defprocess_request(self, request, spider):

driver = webdriver.Edge()

driver.get(request.url)

content = driver.page_source.encode('utf-8')

driver.quit()

returnHtmlResponse(request.url, encoding='utf-8', body=content, request=request)

之后我们还需要修改爬虫设置文件settings.py,将

#DOWNLOADER_MIDDLEWARES = {

# 'toutiao.middlewares.ToutiaoDownloaderMiddleware': 543,

#}

三行前的#号去掉,来让下载中间件生效。

通过以上这些操作,scrapy在访问网页时会调用Selenium模拟Edge浏览器,从而拿到js渲染后的网页内容。具体来说,第一行获取一个Edge driver,接着用该driver打开url对应的网址,之后将网页内容(page_source)用utf-8编码,然后关闭driver,最后封装成一个HtmlResponse对象返回,该对象将会作为response参数被传递给parse函数。

为了让scrapy保存输出文件时用utf-8格式,我们还需要在settings.py文件中增加一行(位置可以是任意一个空行)FEED_EXPORT_ENCODING = 'utf-8'。

接下来我们编写spider文件,在spiders目录下创建zzzs_spider.py,编写如下代码:

(本文代码开源在https://github.com/runninglsy/toutiao_spider)

388d907def8e47a98b25b2fdb0bf0c2b85812056.jpg

首先看start_requests函数。search_result_url是在头条搜索自主招生的搜索结果网址,我们用get函数模拟浏览器打开该网址,之后time.sleep(3)表示程序暂停3秒,这是为了模拟人类浏览网页的行为,避免被头条服务器识别为爬虫然后被封禁。之后在for循环里模拟下拉操作来加载更多搜索结果,每次下拉后随机等待3-6秒,总共下拉5次(具体次数可以根据需要更改)。下拉操作结束后,我们需要从网页源码中解析出每个搜索结果的超链接,这可以通过ccs选择器做到。首先构造一个选择器Selector,解析的文本为网页源码page_source,然后调用ccs(".rbox’),这里’.rbox’是一个pattern,用来匹配搜索结果页面的绿框内容。

pattern的确定可以借助Chrome的一款插件SelectorGadget,具体用法网上有很多教程,在此限于篇幅就不展开了。最后一步是从匹配到的源码中抽出url字符串,观察网页源码发现其都有类似的模式,因此可以用正则表达式匹配,即代码中的re函数。

parse函数相对简单,借助于SelectorGadget,很容易将每个搜索结果网页的标题和内容抽取出来,判断标题和内容都不是空白后,将标题、内容和url封装成一个字典yield。

最后,在crawleroutiao目录下打开Powershell输入scrapy crawl zzzs –o zzzs.json,回车运行zzzs爬虫,这里-o zzzs.json,表示将爬取到的结果(即parse函数里yield的内容)保存到项目目录下的zzzs.json文件中,类似下图

2fed10f0c94141b8a1877007438deea686280692.jpg

至此,我们可以看到,我们就把网页的内容,以模拟人类的行为,将文本的内容保存在本地啦,是不是很神奇。当然,这里我们只给了一种示例的内容,完全是因为,想让社会学的小伙伴们能够应用起来,给的示例也不是特别难。想要有更复杂的教程,就可以去网上看咯,当然,跟着我们这个教程学习完毕之后,一定会对整个爬虫、数据清洗并统计相关有用信息的流程会有大致的了解。肯定会有机智的小伙伴们,能举一反三,就灵活应用起来啦!

虽然如此,还是希望大家能期待我们之后对于数据清洗的推文哦。

欢迎大家踊跃投稿,内容有关人文社会科学的即可,可以是学术前沿思想介绍、各种定量研究技术和方法介绍、各种软件(stata、Python、R语言,数据可视化等等)数据处理及分析技巧,可以是网络爬虫技巧,也可以是学术论文写作与发表等相关内容。

投稿要求:

1、务必原创、禁止抄袭;

2、务必准确、详细,有例子,有数据,有截图;

注意事项:

1、所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,我们会在推文里注明作者署名,并有稿酬提供;

2、邮件请注明投稿,邮件名为“投稿+推文名称+作者+联系方式”;

以人文之情怀

以学术为志业

···········

编辑|王鑫泰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值