Python写爬虫——抓取网页并解析HTML

本文详细介绍了如何使用Python进行网页数据抓取,并通过HTML解析器解析网页内容,提取所需信息。包括基本的HTML抓取方法、使用SGMLParser进行网页解析的示例程序,以及如何处理乱码问题。

主要思路:

1.各种语言利用http相关模块,发送http请求,获取reponse内容,html内容,即xml标签集。

2.利用xml分析工具和正则表达式,对收到的整个内容进行过滤和处理,获得最终想要的数据,存储起来。


网上的一个例子:

转自:http://www.lovelucy.info/python-crawl-pages.html

CUHK 上学期有门课叫做 Semantic Web,课程 project 是要搜集整个系里面的教授信息,输入到一个系统里,能够完成诸如“如果选了A教授的课,因时间冲突,B教授的哪些课不能选”、“和A教授实验室相邻的实验室都是哪些教授的”这一类的查询。这就是所谓的“语义网”了啊。。。然而最坑爹的是,所有这些信息,老师并没有给一个文档或者数据库,全要靠自己去系主页上搜集。唯一的想法是写个爬虫,令人悲哀的是,所有做这个 project 的同学,都是纯人肉手工完成,看得我只想扶墙。。。

从网页中抓取特定信息,我觉得这是一个普遍性的问题,以后经常会遇到。幸亏那个 project 只是需要我们系的所有教授的信息,大家人工也就算了。如果需要抓取的信息是海量的,举个栗子,把淘宝上所有的商品目录抓下来,那岂不是要吐血而亡?我决定好好把爬虫研究一下。

之前波波写过一个 java 程序,利用  HTML Parser  去解析团购网站 meituan.com 然后把每天的团购信息存到数据库里。稍微改改再爬爬拉手糯米,做个前端,一个团购导航站就问世了。我把程序跑了一下,全自动搜集,不算太复杂。

但是,我觉得 java 太啰嗦,不够简洁。Python 这个脚本语言开发起来速度很快,一个活生生的例子是因有关政策 verycd 开始自我阉割,有网友为了抢救资源,把整个 verycd 站爬了下来,镜像为SimpleCD.org。看了一下爬虫 源代码,其实挺简单。使用方法:

看看效果:http://www.lovelucy.info/demo/www.163.com

1. 获取html页面

其实,最基本的抓站,两句话就可以了

import urllib2
content = urllib2.urlopen('http://XXXX').read()

这样可以得到整个 html 文档,关键的问题是我们可能需要从这个文档中获取我们需要的有用信息,而不是整个文档。这就需要解析充满了各种标签的 html。

2. 解析 html

SGMLParser

Python 默认自带 HTMLParser 以及 SGMLParser 等等解析器,前者实在是太难用了,我就用 SGMLParser 写了一个示例程序:

import urllib2
from sgmllib import SGMLParser
 
class ListName(SGMLParser):
	def __init__(self):
		SGMLParser.__init__(self)
		self.is_h4 = ""
		self.name = []
	def start_h4(self, attrs):
		self.is_h4 = 1
	def end_h4(self):
		self.is_h4 = ""
	def handle_data(self, text):
		if self.is_h4 == 1:
			self.name.append(text)
 
content = urllib2.urlopen('http://list.taobao.com/browse/cat-0.htm').read()
listname = ListName()
listname.feed(content)
for item in listname.name:
	print item.decode('gbk').encode('utf8')


很简单,这里定义了一个叫做 ListName 的类,继承 SGMLParser 里面的方法。使用一个变量 is_h4 做标记判定 html 文件中的 h4 标签,如果遇到 h4 标签,则将标签内的内容加入到 List 变量 name 中。解释一下 start_h4() 和 end_h4() 函数,他们原型是 SGMLParser 中的

start_tagname(self, attrs)
end_tagname(self)

tagname 就是标签名称,比如当遇到 <pre>,就会调用 start_pre,遇到 </pre>,就会调用end_preattrs 为标签的参数,以 [(attribute, value), (attribute, value), ...] 的形式传回。

输出:

虚拟票务
数码市场
家电市场
女装市场
男装市场
童装童鞋
女鞋市场
男鞋市场
内衣市场
箱包市场
服饰配件
珠宝饰品
美容市场
母婴市场
家居市场
日用市场
食品/保健
运动鞋服
运动户外
汽车用品
玩具市场
文化用品市场
爱好市场
生活服务

如果有乱码,可能是与网页编码不一致,需要替换最后一句 deconde() 的参数,我在香港淘宝默认用的是繁体编码。各位可以 copy 上面的代码自己试试,把淘宝的商品目录抓下来,就是这么简单。稍微改改,就可以抽取二级分类等其他信息。

Python爬虫应用于抓取百度图片通常涉及使用第三方库如`requests`, `BeautifulSoup` 或者 `Scrapy`框架。以下是基本步骤: 1. **导入所需库**: 首先,你需要安装`requests`库来发送HTTP请求,以及可能需要的如`bs4`(BeautifulSoup4)用于解析HTML内容。 ```python import requests from bs4 import BeautifulSoup ``` 2. **发送GET请求**: 使用`requests.get()`函数获取百度图片搜索结果网页源码。 ```python url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&stc=1&fr=&sf=1&fmq=1689375560990_R&pv=&ic=0&nc=1&z=&word=' + keyword response = requests.get(url) ``` 这里`keyword`是你想要搜索的图片关键字。 3. **解析HTML**: 使用BeautifulSoup解析返回的HTML,找到包含图片URL的部分。这通常涉及到查找`<img>`标签的`src`属性。 ```python soup = BeautifulSoup(response.text, 'lxml') img_tags = soup.find_all('img', src=True) # 查找所有有src属性的<img>元素 ``` 4. **提取图片URL**: 循环遍历`img_tags`,提取每个图片链接。 ```python image_urls = [img['src'] for img in img_tags] ``` 5. **保存图片**: 可以使用`requests`库下载图片到本地,如果图片地址是HTTP的话。记得处理可能出现的网络错误。 ```python for url in image_urls: try: response = requests.get(url, stream=True) with open(f'{keyword}_{i}.jpg', 'wb') as f: for chunk in response.iter_content(chunk_size=1024): if chunk: # filter out keep-alive new chunks f.write(chunk) except Exception as e: print(f"Failed to download {url}: {e}") ``` 6. **注意事项**: - 爬虫操作需遵守百度的robots.txt规则,尊重版权,合理使用抓取数据。 - 实际操作可能会遇到反爬虫策略,可能需要设置延迟、用户代理等。 - 如果需要大规模抓取好使用Scrapy等专业的爬虫框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值