赞
踩
编者按
众所周知,Python是一门编程语言,操作简洁而清晰、功能专业而强大、入门容易又严谨。2018年,教育部正式将人工智能、物联网、大数据处理划入高中课程,这就意味着,现在的中学生开始就要学习编程语言了,不会点Python,都不好意思说我们是走在时代前沿的人了
Python已广泛应用于大数据、社会网络、数据挖掘、网络爬虫、机器学习、计量经济学等诸多前沿领域,越来越多来自心理学、社会学、经济学、新闻传播学、历史学、艺术学等学科的研究者在用Python开展有趣而富有挑战性的研究议题。显然,编程语言已经在人文社会科学领域显示出了广阔的应用前景。可能我们要问了:对于有计算机编程基础的同学学起来当然不会太费力,而我们人文社科领域的同学呢?学起来会有问题吗?答案是:只要多下一些功夫,一定是可以会哒。
因此,基于人文社科领域的同学对于Python的应用来说,我们不求做个人文社科领域的程序员,我们追求的是将Python这门语言技术应用在我们的研究中。
因此我们推出了“社会科学中的Python应用”系列,将为你系统的描述如何利用Python爬取你想要研究的数据——数据来了以后怎么样用Python来数据清洗,数据处理——数据处理完了以后可以用Python来做哪些可视化?——以及用Python来做诸如文本分析、词频分析、情感分析等等统计分析?——最终形成我们的研究,这样一个系列的研究实现过程。这才是我们关注和强调的!!!
在学习的过程中,如果大家有什么问题,也可以在文末留言,我们会请专业老师解答哦!!
大家好!今天来给大家介绍一下,“爬虫”!
其实这个名词很早就出现在人们的视野中,但是最近发现它的功能太强大了,以至于社会学的小伙伴们都开始觊觎它啦,之后我们会以爬虫、数据清洗、统计这样的思路给大家介绍一个小小的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窗口会输出一系列调试信息,类似下图
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)
首先看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文件中,类似下图
至此,我们可以看到,我们就把网页的内容,以模拟人类的行为,将文本的内容保存在本地啦,是不是很神奇。当然,这里我们只给了一种示例的内容,完全是因为,想让社会学的小伙伴们能够应用起来,给的示例也不是特别难。想要有更复杂的教程,就可以去网上看咯,当然,跟着我们这个教程学习完毕之后,一定会对整个爬虫、数据清洗并统计相关有用信息的流程会有大致的了解。肯定会有机智的小伙伴们,能举一反三,就灵活应用起来啦!
虽然如此,还是希望大家能期待我们之后对于数据清洗的推文哦。
欢迎大家踊跃投稿,内容有关人文社会科学的即可,可以是学术前沿思想介绍、各种定量研究技术和方法介绍、各种软件(stata、Python、R语言,数据可视化等等)数据处理及分析技巧,可以是网络爬虫技巧,也可以是学术论文写作与发表等相关内容。
投稿要求:
1、务必原创、禁止抄袭;
2、务必准确、详细,有例子,有数据,有截图;
注意事项:
1、所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,我们会在推文里注明作者署名,并有稿酬提供;
2、邮件请注明投稿,邮件名为“投稿+推文名称+作者+联系方式”;
以人文之情怀
以学术为志业
···········
编辑|王鑫泰
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。