python爬取网页源码(python 网页爬取)

http://www.itjxue.com  2023-04-14 04:27  来源:未知  点击次数: 

如何利用Python抓取静态网站及其内部资源?

这个非常闭册塌简单,requests+BeautifulSoup组合就可以轻松实现,下轿圆面我简单介绍一下,感兴趣的朋友可以自己尝试一下,这里以爬取糗事百科网站数据(静态网站)为例:

1.首先,安装requets模块,这个直接在cmd窗口输入命令“pipinstallrequests”就行,如下:

2.接着安装bs4模块,这个模块包含了BeautifulSoup,安装的话,和requests一样,直接输入安装命令“pipinstallbs4”即可,如下:

3.最后就是requests+BeautifulSoup组合爬取糗事百科,requests用于请求页面,BeautifulSoup用于解析页面,提取数据,主要步骤及截图如下:

这里假设爬取的数据包含如下几个字段,包括用户昵称、内容、好笑数和评论数:

接着打开对应网页源码,就可以直接看到字段信息,内容如下,嵌套在各个标签中,后面就是解析这些标签提取数据:

基于上面网页内容,测试代码如下,非常简单,直接find对应标签,提取文本内容即可:

程序运行截图如下,已经成功抓取到网站数据:

至此,我们就完成了使用python来爬去静态网站。总的来说,整个过程非常简单,也是最基本的爬虫内容,只要你有一定的python基础,熟悉一下上面的示例,很快就能掌握的,当然,你也可以使用urllib,正则表达式匹配等,都行,网上也有相关教程和资料,介绍的非常详细,感兴趣的话,可以姿段搜一下,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言进行补充。

python怎么爬取网页源代码

#!/usr/bin/env python3

#-*- coding=utf-8 -*-

import urllib3

if __name__ == '__main__':

http=urllib3.PoolManager()

r=http.request('GET','IP')

print(r.data.decode("gbk"))

可以正常抓取悄晌。启御锋拆宏需要安装urllib3,py版本3.43

如何用python爬取网站数据?

这里简单介绍一下吧,以抓取网站静态、动态2种数据为慧返拍例,实验环境win10+python3.6+pycharm5.0,主要内容如下:

抓取网站静态数据(数据在网页源码中):以糗事百科网站数据为例

1.这里假设我们抓取的数据如下,主要包括用户昵称、内容、好笑数和评论数这4个字段,如下:

对应的网页源码如下,包含我们所需要的数据:

2.对应网页结构,主要代码如下,很简单,主要用到requests+BeautifulSoup,其中requests用于请求页面,BeautifulSoup用于解析页面:

程序运行截图如下,已经成功爬取到数据:

抓取网站动态数据(数据不在网页源码中,json等文件中):以人人贷网站数据为例

1.这里假设我们爬取的是债券数据,主要包括年利率世型、借款标题、期限、金额和进度这5个字段信息,截图如下:

打开网页源码中,可以发现数据不在网页源码中,按F12抓包分析时,才发现在一个json文件中,如下:

2.获取到json文件的url后,我们就可以爬取对应数据了,这里使用的包与上面类似,因为是json文件,所以还用了json这个包(解析json),主要内容如下:

程序运行截图如下,前羡已经成功抓取到数据:

至此,这里就介绍完了这2种数据的抓取,包括静态数据和动态数据。总的来说,这2个示例不难,都是入门级别的爬虫,网页结构也比较简单,最重要的还是要会进行抓包分析,对页面进行分析提取,后期熟悉后,可以借助scrapy这个框架进行数据的爬取,可以更方便一些,效率更高,当然,如果爬取的页面比较复杂,像验证码、加密等,这时候就需要认真分析了,网上也有一些教程可供参考,感兴趣的可以搜一下,希望以上分享的内容能对你有所帮助吧。

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

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

心想,爬虫不太难的,当年跟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?selenium.webdriver.common.keys?import?Keys

import?time

import?sys

default_encoding?=?'utf-8'

if?sys.getdefaultencoding()?!=?default_encoding:

reload(sys)

sys.setdefaultencoding(default_encoding)

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

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

flag?=?1

while?(flag??0):

driver?=?webdriver.Chrome()

driver.get("hianCe/")

#?选择降雨量

driver.find_element_by_xpath("//span[@id='fenqu_H24R']").click()

filename?=?time.strftime("%Y%m%d%H%M",?time.localtime(time.time()))?+?'.txt'

#创建文件

output_file?=?open(filename,?'w')

#?选择行政区

for?i?in?range(len(district_navs)):

driver.find_element_by_xpath("//div[@id='"?+?district_navs[i]?+?"']").click()

#?print?driver.page_source

timeElem?=?driver.find_element_by_id("time_shikuang")

#输出时间和站点名

output_file.write(timeElem.text?+?',')

output_file.write(district_names[i]?+?',')

elems?=?driver.find_elements_by_xpath("//span[@onmouseover='javscript:changeTextOver(this)']")

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

for?elem?in?elems:

output_file.write(AMonitorRecord(elem.get_attribute("title"))?+?',')

output_file.write('\n')

output_file.close()

driver.close()

time.sleep(3600)

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

[python]?view plain?copy

#Encoding=utf-8

def?OnlyCharNum(s,?oth=''):

s2?=?s.lower()

fomart?=?'abcdefghijklmnopqrstuvwxyz0123456789,.'

for?c?in?s2:

if?not?c?in?fomart:

s?=?s.replace(c,?'')

return?s

def?AMonitorRecord(str):

str?=?str.split(":")

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

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

(责任编辑:IT教学网)

更多

推荐DNS服务器文章