python爬虫怎么获取动态的网页源码

python爬虫怎么获取动态的网页源码,第1张

一个月前实习导师布置任务说通过网络爬虫获取深圳市气象局发布的降雨数据网页如下:

心想,爬虫不太难的,当年跟zjb爬煎蛋网无(mei)聊(zi)图的时候,多么清高。由于接受任务后的一个月考试加作业一大堆,导师也不催,自己也不急。

但是,导师等我一个月都得让我来写意味着这东西得有多难吧。。。今天打开一看的确是这样。网站是基于Ajax写的,数据动态获取,所以无法通过下载源代码然后解析获得。

从某不良少年写的抓取淘宝mm的例子中收到启发,对于这样的情况,一般可以同构自己搭建浏览器实现。phantomJs,CasperJS都是不错的选择。

导师的要求是获取过去一年内深圳每个区每个站点每小时的降雨量,执行该 *** 作需要通过如上图中的历史查询实现,即通过一个时间来查询,而这个时间存放在一个hidden类型的input标签里,当然可以通过js语句将其改为text类型,然后执行send_keys之类的 *** 作。然而,我失败了。时间可以修改设置,可是结果如下图。

为此,仅抓取实时数据。选取python的selenium,模拟搭建浏览器,模拟人为的点击等 *** 作实现数据生成和获取。selenium的一大优点就是能获取网页渲染后的源代码,即执行 *** 作后的源代码。普通的通过 url解析网页的方式只能获取给定的数据,不能实现与用户之间的交互。selenium通过获取渲染后的网页源码,并通过丰富的查找工具,个人认为最好用的就是find_element_by_xpath("xxx"),通过该方式查找到元素后可执行点击、输入等事件,进而向服务器发出请求,获取所需的数据。

[python] view plain copy

# coding=utf-8

from testString import 

from selenium import webdriver

import string

import os

from seleniumwebdrivercommonkeys import Keys

import time

import sys

default_encoding = 'utf-8'

if sysgetdefaultencoding() != default_encoding:

reload(sys)

syssetdefaultencoding(default_encoding)

district_navs = ['nav2','nav1','nav3','nav4','nav5','nav6','nav7','nav8','nav9','nav10']

district_names = ['福田区','罗湖区','南山区','盐田区','宝安区','龙岗区','光明新区','坪山新区','龙华新区','大鹏新区']

flag = 1

while (flag > 0):

driver = webdriverChrome()

driverget("hianCe/")

# 选择降雨量

driverfind_element_by_xpath("//span[@id='fenqu_H24R']")click()

filename = timestrftime("%Y%m%d%H%M", timelocaltime(timetime())) + 'txt'

#创建文件

output_file = open(filename, 'w')

# 选择行政区

for i in range(len(district_navs)):

driverfind_element_by_xpath("//div[@id='" + district_navs[i] + "']")click()

# print driverpage_source

timeElem = driverfind_element_by_id("time_shikuang")

#输出时间和站点名

output_filewrite(timeElemtext + ',')

output_filewrite(district_names[i] + ',')

elems = driverfind_elements_by_xpath("//span[@onmouseover='javscript:changeTextOver(this)']")

#输出每个站点的数据,格式为:站点名,一小时降雨量,当日累积降雨量

for elem in elems:

output_filewrite(AMonitorRecord(elemget_attribute("title")) + ',')

output_filewrite('\n')

output_fileclose()

driverclose()

timesleep(3600)

文件中引用的文件testString只是修改输出格式,提取有效数据。

[python] view plain copy

#Encoding=utf-8

def OnlyCharNum(s, oth=''):

s2 = slower()

fomart = 'abcdefghijklmnopqrstuvwxyz0123456789,'

for c in s2:

if not c in fomart:

s = sreplace(c, '')

return s

def AMonitorRecord(str):

str = strsplit(":")

return str[0] + "," + OnlyCharNum(str[1])

一小时抓取一次数据,结果如下:

采集表格内容,包括列表形式的商品评论信息、正文中的表格等,凡是html代码采用<table>表单形式的表格,都可以不写代码,通过可视化的方式完成采集。

首先,我们使用的工具是前嗅大数据的ForeSpider数据采集系统。在前嗅大数据官网下载免费版 ,免费版就可以满足我们抓取的需求。

下载安装后,启动软件。根据如下步骤,即可抓取到或的地址了。

在ForeSpider中,采集表格的功能称之为“多值”。多值用于存储表格的数据,将表格的不同列对应存入不同字段,表格的不同行分别存储为数据表的多条记录。本文以某表格为例。

需要多值存储的表格

(一)创建表单

根据表格内容,创建一个存储表格数据的表单。在选项卡“表单”中,创建一个表单。

多值的表结构

1主键

采集表格时,表格的一行作为一条数据。由于整个表格属于同一个网页文档,而文档主键只有一个,因此不能像采集其他内容一样,取值类型选择“文档主键”。

表格的主键的变量类型,根据表格的行数长度,选择“Integer”或者“Long”。取值类型选择“空”。字段属性选择“主键字段”和“自动字段”(选择主键字段后,软件会自动选择“键值唯一”和“索引字段”。)

这里以python为例,简单介绍一下如何通过python网络爬虫获取网站数据,主要分为静态网页数据的爬取和动态网页数据的爬取,实验环境win10+python36+pycharm50,主要内容如下:

静态网页数据

这里的数据都嵌套在网页源码中,所以直接requests网页源码进行解析就行,下面我简单介绍一下,这里以爬取糗事百科上的数据为例:

1首先,打开原网页,如下,这里假设要爬取的字段包括昵称、内容、好笑数和评论数:

接着查看网页源码,如下,可以看的出来,所有的数据都嵌套在网页中:

2然后针对以上网页结构,我们就可以直接编写爬虫代码,解析网页并提取出我们需要的数据了,测试代码如下,非常简单,主要用到requests+BeautifulSoup组合,其中requests用于获取网页源码,BeautifulSoup用于解析网页提取数据:

点击运行这个程序,效果如下,已经成功爬取了到我们需要的数据:

动态网页数据

这里的数据都没有在网页源码中(所以直接请求页面是获取不到任何数据的),大部分情况下都是存储在一个json文件中,只有在网页更新的时候,才会加载数据,下面我简单介绍一下这种方式,这里以爬取人人贷上面的数据为例:

1首先,打开原网页,如下,这里假设要爬取的数据包括年利率,借款标题,期限,金额和进度:

接着按F12调出开发者工具,依次点击“Network”->“XHR”,F5刷新页面,就可以找打动态加载的json文件,如下,也就是我们需要爬取的数据:

2然后就是根据这个json文件编写对应代码解析出我们需要的字段信息,测试代码如下,也非常简单,主要用到requests+json组合,其中requests用于请求json文件,json用于解析json文件提取数据:

点击运行这个程序,效果如下,已经成功爬取到我们需要的数据:

至此,我们就完成了利用python网络爬虫来获取网站数据。总的来说,整个过程非常简单,python内置了许多网络爬虫包和框架(scrapy等),可以快速获取网站数据,非常适合初学者学习和掌握,只要你有一定的爬虫基础,熟悉一下上面的流程和代码,很快就能掌握的,当然,你也可以使用现成的爬虫软件,像八爪鱼、后羿等也都可以,网上也有相关教程和资料,非常丰富,感兴趣的话,可以搜一下,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言进行补充。

以上就是关于python爬虫怎么获取动态的网页源码全部的内容,包括:python爬虫怎么获取动态的网页源码、源码中没有出现的数据如何爬虫、如何通过网络爬虫获取网站数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9820604.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存