网页新闻抓取(田朴珺否认与王石婚姻危机,怒怼网友:吃饱了撑的)

优采云 发布时间: 2021-10-12 06:14

  网页新闻抓取(田朴珺否认与王石婚姻危机,怒怼网友:吃饱了撑的)

  据说,大老王的妻子田朴君否认与王石有婚姻危机,被网友气愤:受够了。

  

  王石

  之后,大老王成了热搜名人。

  

  再次成为网红

  不少网友表示,怎么能这么说话呢?反正你也是个“贵族”……

  今天,我们不讨论这个。我们专门讲解如何使用Python在海量新浪新闻中获取我们想认识的人的消息。我们以大老王的消息为例。本文只讨论技术问题。如果您有兴趣批量获取新浪新闻内容,建议您继续往下阅读。如果你通过这篇文章,你可以得到一个很好的工具。

  

  获取新闻

  情况总结

  对于这个话题,我尝试了N种方法。如果只抓取新闻,比如首页展示的新闻,新浪没有实施反爬措施,或者反爬措施比较容易破解。但是,如果使用搜索功能,仍然很难抓取搜索到的内容......

  今天,我们将教你如何降低这个难度。

  简单的方法

  刚开始的时候,我的想法是这样的。我先进入新闻搜索页面,然后搜索“王石”,出现了以下内容。

  

  搜索王士后界面

  可以看到,内容一共7页,有点小。第一页只有4条新闻,之后每页有20条新闻。(抱歉,我发现了一个bug,截至发帖时,文章的总数并不是我看到的132个,实际上只有116个,我们自己验证一下)

  想法

  分析网址信息

  

  网址信息

  我在使用requests库时,第一页信息正常,但是第二页无法获取。其实页面是由js代码控制的。每次点击页码都会出现相应的内容。如果使用修改后的 URL 传递参数,一般不会从第二页获取内容。

  因此,分析网站地址的信息和内容应该是解决此类问题的重中之重。

  那该怎么办呢?

  我们知道,对于这种js加载页面问题,有两种方式:一种是使用Python中的相关模块来执行js代码,网上有很多教程,感兴趣的朋友可以参考学习;另一种是使用selenium或者PhantomJS等自动化模块模拟一个人打开一个网页,然后获取该网页的源代码(此时获取的代码就是执行js后的代码),然后分析内容。

  

  怎么做?

  想法

  今天,我们重点用第二种方法来梳理一下新浪新闻中关于王石的新闻。我们的想法是直接打开这个搜索页面,首先获取第一页的内容,从中提取出我们需要的信息;那么你每次使用selenium点击下一页的内容时,都会得到下一页的源码,提取你需要的信息。最后,我们每个页面需要的信息通过一个列表返回。

  准备环境

  Python3.7 安装 selenium、requests、bs4 库

  具体实施步骤

  【获取单页内容】

  

  准备开始

  一、设置UA代理

  header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome /63.0.3239.132 Safari/537.36'}

  这里的UA代理是爬虫的基础。UA代理池可以自己搭建,这里不再赘述。

  然后获取单页的内容。由于搜索URL的URL是经过编码的,这里应该设置一个URL处理函数

  def parse_key(key):

  返回 parse.quote(key, encoding='gb2312')

  然后使用这个函数来获取单个页面的内容。

  def get_text(key='王石'):

  req = requests.get(url.format(parse_key(key)), headers=header).text

  返回请求

  这里没有异常处理,貌似不需要了,可以自己添加。

  【使用selenium自动化处理】

  

  自动化处理

  定义一个函数,使用webdriver打开URL并返回webdriver对象,方便我们后续的操作

  def in_url(url):

  wb = webdriver.Ie()

  wb.get(url)

  返回 wb

  然后,当我们点击一​​个页码时,就会显示每个页面的新闻内容并获取源代码。

  def click_element(wb, el_no, total_no):

  如果 el_no == 1:

  e = wb.find_element_by_xpath('//*[@id="_function_code_page"]/a[1]')

  e.click()

  elif 1

  e = wb.find_element_by_xpath('//*[@id="_function_code_page"]/a[{}]'.format(

  el_no + 2))

  e.click()

  返回 wb.page_source

  以上两步是重点。通过分析,我们知道每次点击“Next Page”,xpath变化范围为页码+2(因为网页中增加了“Previous Page”和“Next Page”选项),当el_no为1时,我们实际点击获取第二页的内容。以上内容不难理解。

  【使用BeautifulSoup库获取有效信息】

  

  汤不错,可以煮吗

  下面是我们定义的获取信息的函数。它可以从单个页面的内容中搜索所有“h2”标签内容(包括新闻标题、作者、发布日期、新闻链接等),我们会从标签中一一获取关键内容出来。

  def find_info_bs4(html):

  r_lst = []

  汤 = BeautifulSoup(html,'html.parser')

  对于soup.find_all('h2') 中的项目:

  tmp_dict = {}

  tmp_dict['title'] = item.find('a').text

  打印(tmp_dict['title'])

  tmp_dict['author'] = item.find('span').text.split('')[0]

  打印(tmp_dict['作者'])

  tmp_dict['time'] = "".join(item.find('span').text.split('')[1:])

  打印(tmp_dict['时间'])

  tmp_dict['url'] = item.find('a').get('href')

  打印(tmp_dict['url'])

  r_lst.append(tmp_dict)

  返回 r_lst

  【整合流程】

  

  资源整合

  # 使用selenium输入网址

  wb = in_url(url.format(parse_key('王石')))

  # 最后结果

  结果_lst = []

  print('第一页')

  # 首先将第一页新闻过滤器添加到result_lst

  result_lst.extend(find_info_bs4(wb.page_source))

  打印('{}'.format(len(find_info_bs4(wb.page_source))))

  # 获取总页数,有多少分页元素就有多少页

  n = len(wb.find_elements_by_xpath('//*[@id="_function_code_page"]/a'))

  # 遍历每一页

  对于范围内的 i (1, n):

  print('第{}页'.format(i + 1))

  # 点击获取源代码

  html = click_element(wb, i, n)

  # 提取有效信息并将字典添加到result_lst

  result_lst.extend(find_info_bs4(html))

  打印('添加记录{)项目'。格式(len(find_info_bs4(html))))

  # 打印最终消息的数量

  打印(len(result_lst))

  执行结果显示

  最后得到如下内容

  

  程序运行结果显示

  好了,今天就到此为止。这个怎么样?是不是很酷?有兴趣的小朋友可以试一试。如果修改关键字,则可以检索其他新闻内容。实际上,您可以更改 result_lst 来设置数据类型。当然,你也可以将这些函数封装成一个类来使用。你可以做更多的扩展,这取决于你。

  欢迎大家关注我,更多有趣的内容稍后发布。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线