本期为python爬虫实践的第八节,传送门:
Python爬虫实践(1)--大数据时代的数据挑战
Python爬虫实践(2)--非结构化数据与爬虫
Python爬虫实践(3)--了解网络爬虫背后的秘密
Python爬虫实践(4)--编写第一个网络爬虫程序
Python爬虫实践(5)--使用BeautifulSoup解析网页元素
Python爬虫实践(6)--BeautifulSoup的基础操作
Python爬虫实践(7)--抓取菜鸟教程python学习路线
本期教程我们以新浪科技资讯页面为例,看一看新浪资讯页面的抓取该如何实现。
打开开发者工具,通过对页面源代码的分析,可以知道:我们想要获取的资讯列表被包含在一个使用了cardlist-a__list样式的div中,我们可以根据这一点,将内容提取出来。代码如下:
import requestsfrom bs4 import BeautifulSoupres = requests.get('https://tech.sina.com.cn/')res.encoding = 'utf-8'soup = BeautifulSoup(res.text, 'html.parser')print(soup.select('.cardlist-a__list'))
但是代码执行的结果,并不是我们想要的,结果如下图。执行结果只是提取出了一个div,但div里面包含的内容,却一点都没有。由此我们猜测这里的内容是在页面加载的后期通过js代码加载而来的。
经过一番查找,最后我们在一个资源中找到了动态的信息,如下图。
由于这个资源的URL特别长,里面的参数比较多,我们试着对这个URL进行分析。我们找来了新浪体育资讯页面中,同样用来加载动态信息的这个URL。经过对比和反复的测试,我们发现,mod这个参数控制着所要加载的资讯类别,而这个参数的值和整个页面的URL有关。故我们编写了如下代码,对信息进行提取。
import requestsfrom bs4 import BeautifulSoupimport reimport jsonres = requests.get( 'https://cre.mix.sina.com.cn/api/v3/get?callback=jQuery111204369690274915774_1554164761226&cre=tianyi&mod=pctech&merge=3&statics=1&length=15')res.encoding = 'utf-8'data=re.search('{"data".*', res.text)jsondata=json.loads(data.group().rstrip(');'))for news in jsondata['data']: print('标题:'+news['title']+'---作者:'+news['author'])
在上面的代码中,我们使用了json和正则表达式。由于这不是本教程的重点,我们也就不再做详细讲解,如果有读者朋友对这两块的知识有疑问,可以通过网络搜索资料进行学习。