抓取网页新闻(Python爬虫异步新闻爬虫新闻聚合网页下载)

优采云 发布时间: 2022-04-02 07:06

  抓取网页新闻(Python爬虫异步新闻爬虫新闻聚合网页下载)

  这个实际的例子是搭建一个大型的异步新闻爬虫,但是需要几个步骤,从简单到复杂,一步一步搭建这个Python爬虫

  本教程所有代码均使用 Python 3.6 实现,无论 Python 2,强烈建议您使用 Python 3

  

  要爬取新闻,首先要有一个新闻源,也就是爬取的目标网站。国内新闻网站,从中央到地方,从综合到垂直行业,新闻上千条网站。百度新闻()收录约2000多。那么让我们从百度新闻开始吧。

  打开百度新闻的网站首页:

  我们可以看到这是一个新闻聚合页面,里面列出了很多新闻头条及其原创链接。如图所示:

  

  我们的目标是从这里提取这些新闻的链接并下载它们。过程比较简单:

  

  按照这个简单的流程,我们先实现下面的简单代码:

  #!/usr/bin/env python3

  # 作者:veelion

  重新*敏*感*词*

  *敏*感*词*时间

  导入请求

  导入 tldextract

  def save_to_db(url, html):

  # 将网页保存到数据库中,我们暂时替换为打印相关信息

  print('%s : %s' % (url, len(html)))

  定义爬行():

  #1\。下载百度新闻

  hub_url = '#39;

  res = requests.get(hub_url)

  html = res.text

  #2\。提取新闻链接

  ## 2.1 提取所有带有'href'的链接

  链接 = re.findall(r'href=[\'"]?(.*?)[\'"\s]', html)

  print('查找链接:', len(links))

  新闻链接 = []

  ## 2.2 过滤非新闻链接

  对于链接中的链接:

  如果不是 link.startswith('http'):

  继续

  tld = tldextract.extract(链接)

  如果 tld.domain == '百度':

  继续

  news_links.append(链接)

  print('查找新闻链接:', len(news_links))

  # 3\.下载新闻并保存到数据库

  对于 news_links 中的链接:

  html = requests.get(link).text

  save_to_db(链接,html)

  print('工作完成!')

  定义主():

  而1:

  爬行()

  time.sleep(300)

  如果 __name__ == '__main__':

  主要的()

  简单解释一下上面的代码:

  1. 使用请求下载百度新闻首页;

  2. 先用正则表达式提取a标签的href属性,即网页中的链接;然后找出新闻链接,方法是:假设非百度外链是新闻链接;

  3. 将找到的所有新闻链接一一下载并保存到数据库中;暂时用打印相关信息代替保存到数据库的功能。

  4. 每 300 秒重复步骤 1-3 以获取最新消息。

  上面的代码可以工作,但是只能工作,而且槽位也不多,所以我们一边抱怨一边改进这个爬虫。

  1. 添加异常处理

  在编写爬虫时,尤其是与网络请求相关的代码,必须有异常处理。目标服务器是否正常,当时的网络连接是否通畅(超时)等都是爬虫无法控制的,所以在处理网络请求时必须处理异常。网络请求最好设置一个超时时间,以免在某个请求上花费太多时间。超时导致的识别可能是服务器无法响应,也可能是暂时的网络问题。因此,对于超时的异常,我们需要过一段时间再试一次。

  2. 处理服务器返回的状态,如404、500等。

  服务器返回的状态非常重要,它决定了我们的爬虫接下来应该做什么。需要处理的常见状态有:

  301,该URL永久转移到另一个URL,如果稍后请求,转移的URL将被请求

  404,基本上这个网站已经过期了,以后不要再尝试了

  500,服务器内部有错误,可能是暂时的,稍后再试

  3. 管理 URL 的状态

  记下这次失败的 URL,以便稍后重试。对于超时的URL,需要稍后再去抓取,所以需要记录所有URL的各种状态,包括:

  下载成功

  多次下载失败,无需重新下载

  下载

  下载失败,重试

  增加了对网络请求的各种处理,使得爬虫更加健壮,不会随时异常退出,给后续的运维带来了很大的工作量。

  下一节我们将结合代码一一讲述上述三个插槽的改进。有关更多详细信息,请收听下一个细分。

  *

  Python爬虫知识点

  本节我们使用Python的几个模块,它们在爬虫中的作用如下:

  1. 请求模块

  它用于发出 http 网络请求和下载 URL 内容。与 Python 自带的 urllib.request 相比,requests 更容易使用。GET、POST 触手可及:

  导入请求

  res = requests.get(url, timeout=5, headers=my_headers)

  res2 = requests.post(url, data=post_data, timeout=5, headers=my_headers)

  get() 和 post() 函数有许多可选参数。以上用于设置超时和自定义标头。更多参数请参考requests文档。

  无论是get()还是post(),requests都会返回一个Response对象,通过这个对象获取下载的内容:

  res.content 为获取的二进制内容,类型为字节;

  res.text 是二进制内容内容解码后的str内容;

  它首先从响应标头中找到编码。如果没有找到,则通过chardet自动判断编码,赋值给res.encoding,最后将二进制内容解密为str类型。

  经验:res.text在判断中文编码时有时会出错,或者通过cchardet(chardet用C语言实现)获取更准确。在这里,我们举一个例子:

  在 [1] 中:导入请求

  在 [2] 中:r = requests.get('#39;)

  在 [3] 中:r.encoding

  输出[3]:'ISO-8859-1'

  [4]中:导入chardet

  在 [5] 中:chardet.detect(r.content)

  出[5]:{'信心':0.99,'编码':'utf-8','语言':''}

  以上是使用 ipython 交互解释器的演示(强烈推荐使用 ipython,比 Python 自带的解释器好很多)。打开的网址是山西日报数字新闻,网页源代码的代码是手动utf8,也是chardet判断的utf8。而requests本身判断的编码是ISO-8859-1,那么返回文本的中文文本也会出现乱码。

  requests 的另一个有用特性是 Session,它部分类似于浏览器并保存 cookie。之后,需要登录并与cookies相关的爬虫可以使用它的session来实现它。

  2. 重新模块

  正则表达式主要用于提取html中的相关内容,例如本例中的链接提取。对于更复杂的 html 内容提取,推荐使用 lxml。

  3. tldextract 模块

  这是一个第三方模块,需要 pip install tldextract 才能安装。即Top Level Domain extract,即顶级域名提取。前面我们讲过URL的结构,叫做host,是注册域名的子域,com是顶级域名TLD。它的结果是这样的:

  在 [6] 中:导入 tldextract

  在 [7] 中:tldextract.extract('#39;)

  Out[7]: ExtractResult(subdomain='news', domain='baidu', suffix='com')

  返回结构由三部分组成:子域、域、后缀

  4. 时间模块

  时间是我们在程序中经常用到的一个概念,比如在循环中暂停一段时间,获取当前时间戳等。时间模块就是提供时间相关功能的模块。At the same time, there is another module, datetime, which is also time-related, and can be appropriately selected and used according to the situation.

  记住这些模块,你将在未来的爬虫写作生涯中受益匪浅。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线