8

送你一只爬虫——Python爬虫

 3 years ago
source link: https://zhuanlan.zhihu.com/p/392284334
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

送你一只爬虫——Python爬虫

4.5k收藏,CrackingOysters,也是微信公众号

最近几天,有个朋友想在下面的网站搜索科学基金,然后全部汇总一下,方便他查看,问我Python能不能做?

答:可以~

v2-6f4224d04a8118748a7382b90a060c00_720w.jpg

碰巧我很久以前写过一点爬雕虫小技,就帮朋友写起来。实际上写了两个,一个在是针对上面的网站在letpub。一个是科学网基金查询,在sciencenet

现在记录写这两个爬虫的时候的心得和有趣的问题——

本文仅供学习交流使用!行文思路如下,

  1. 爬虫的大致思路 (本文)
  2. 使用Python借助Selenium爬取数据 (本文)
  3. 使用Python里有名的爬虫框架Scrapy写爬虫 (本文)
  4. 将爬虫使用JavaScript/TypeScript实现一遍,对比这三种方式,看看哪种是最顺手(新文章,未开始)

下面让我们进入正文——

这里说的爬虫,并不是下面这只爬虫噢。而是指使用编程的方式,自动化地读取网页,摘取内容,汇总数据,接着重复这个过程,直到关心的网页被处理完毕。

v2-c803066477dfc279ad01717c7b74b24a_720w.jpg

比如,希望将某个网站某个标签的文章,全部存档起来,方面自己离线查看。

比如,希望将某类型的种子视频都存储下来,方便查看。

比如,希望把一些学术论文,搜集,阅读,并写论文。

这些场景如果我们人为地去做,会非常繁琐,浪费很多时间。而爬虫可以将这些繁琐地工作自动化,你只要喝上一杯咖啡(可能是好几杯,如果你爬取的数据太多),像个老板一样,看最后的成果就可以了。

注意:编写爬虫需要遵守法律。

爬虫的大致思路

网上教人写爬虫的文章一爬一大把,但是好的文章却不多。

知道了什么是爬虫,那它是怎么实现的呢?

如果你碰巧感兴趣,或者你有需求写爬虫,那么你可以思考一下再继续阅读。

爬虫对知道的人来说很简单,对不知道的人可能会神秘。

实际上它主要有这么几步

接下来,以朋友的需求为例,分析如何编写爬虫。以下"此需求“都是指这个需求。

此需求是根据关键词搜索国家自然基金,然后将搜索到的项目基金存到一个Excel,方便查看。

类似于,我们在百度谷歌输入关键词,然后将搜索结果提取出来,存到excel里面。

所以要爬取的数据确定了,汇总的形式也确定了。

是否需要登录

接着是看看是不是需要登录网页才能搜索。

如果需要登录,怎么做呢?

大致的思路有如下三种

  1. 获取网站的登录验证接口,然后按照接口的形式发送对应的用户名密码来获取通行证。(提问,这里https是怎么工作的呢?)
  2. 半自动的方式:通过浏览器,获取cookie用于获取权限。
  3. 借助框架,如selenium, pupetter,模拟用户输入用户名和登陆密码。

三种都是需要你有用户名和密码。这里我们不讨论不需要用户名和密码的。

第一种,关键是要获取网站的登录验证接口。

这个需要通过浏览器的开发者工具,分析登陆的时候浏览器与网站的数据交互。此方法需要一定的基本功,且验证的方式比较多,不同的方式验证方式不一样。

第二种,是最简单的,但属于半自动化。

因为通过浏览器,你可以自己输入用户名和密码,然后提取cookie。这个方法只需要你知道怎么获取cookie就可以。这个方法的缺点是,cookie有有效时间,所以过段时间,你要获取新的cookie。

第三种方法,可以理解为使用编程的方式来调用浏览器,输入用户名和密码来通过验证。

这个方式跟第一种方法一样都是自动化的,不同的地方在于你只需要熟悉使用的框架,而不用研究网站的登录验证接口。所以相对而言,花费的时间会少一些。

登录方式内容比较多,让我们先看看如何从爬取的网页提取所需信息,

提取所需的数据

提取所需的数据,分为两为两部分内容:

  1. 一般数据分为好多页,我们需要获取所爬取的所有网页
  2. 在从网页中提取汇总关心的数据

获取所有关心的网页的思路又大致分为两种,

  1. 通过网站的接口
  2. 借助框架,自动化模拟点击下一页

这两种实际上与验证登录的第一种和第三种方式类似。

通过接口的话,你需要获取下一页的接口。

模拟的话,你需要熟悉框架的使用方式。

有些读者可能会问,你说了好几次的框架,这个框架到底是什么东西?框架就是把一些通过的功能封装成容易使用的API,方便更多的用户使用,而不用重复制造轮子。

能不能给点代码?

好的,是时候,show me the code了。

letpub 使用的框架是selenium,下面就让我们看看如何用Selenium怎么提取下一页。

selenium 提取下一页

通过分析网站,搜索基金,我们需要输入关键词,开始和结束时间,然后点击查询按钮。所以我们可以通过Selenium进行这样的模拟,代码如下,

class Form:
    def __init__(self, driver):
        self.driver = driver
        self.form = driver.find_element_by_id("searchform_advanced")
    def input_search_name(self, name):
        self.search_name= name
    def input_start_time(self, time):
        self.start_time = time
    def input_end_time(self, time):
        self.end_time = time
    def submit(self):
        n = self.form.find_element_by_id('name')
        n.send_keys(self.search_name)
        start_time = self.form.find_element_by_id('startTime')
        start_time.send_keys(self.start_time)
        end_time = self.form.find_element_by_id('endTime')
        end_time.send_keys(self.end_time)
        button = self.form.find_element_by_id('submit')
        button.click()

模拟的套路很简单:

获取关键词的输入文本框,然后通过send_keys输入我们要查询的关键词。使用同样的方法,出入开始时间和结束时间。

最后通过一行代码button.click()可以完成搜索啦!

从网页提取关心的数据

在letpub网页中,朋友关心的数据是基金的名字,批准年度,负责人等等信息。

前面我们已经获取了网页,那么接下来,我们可以通过xpath, css selector,或者其他网页解析模块,如bs4,来提取关心的数据。没有相对明显的优劣之分,选择你喜欢的即可。这里以xpath为例。

比如我们要提取基本的负责,我们可以通过Chrome 的devTool来定位到这个负责人的DOM节点,然后右键就可以拷贝xpath

获取的xpath是//*[@id="dict"]/table/tbody/tr[3]/td[1]

代码是 response.xpath('//*[@id="dict"]/table/tbody/tr[3]/td[1]'。这个数据是以表格的形式布局的,所以有一定的规律,所以也可以通过切分表格提取信息,代码如下,

def parseItem(i):
    try:
        first_td_list = i[0].find_elements_by_xpath('./td')
        first_record = map(lambda x: x.text, first_td_list)
        second_record = map(
            lambda x: x.find_elements_by_xpath('./td[2]')[0].text, i[1:])
    except:
        logging.exception("parse error")
    return list(first_record) + list(second_record)

此代码来源于parseItem

登录方式的分析(留给下文)

第二个爬虫使用Scrapy爬取科学网基金留给下文。

爬虫的搜索结果_百度图片搜索

JScalpel/letpub at master · Celthi/JScalpel

GitHub - Celthi/ScienceNetool


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK