网页新闻抓取(田朴珺否认与王石婚姻危机,怒怼网友:吃饱了撑的)
优采云 发布时间: 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 来设置数据类型。当然,你也可以将这些函数封装成一个类来使用。你可以做更多的扩展,这取决于你。
欢迎大家关注我,更多有趣的内容稍后发布。