Python抓取中文网页

早就有想法把博客每天的访问流量记下来,刚好现在申请了GAE的应用,又开始学Python,正好拿这个练手。打算先利用Python把访问记录保存在本地,熟悉之后可以部署到GAE,利用GAE提供的cron就可以每天更近访问流量了。OK,开始~

首先是简单的网页抓取程序:

import sys, urllib2 

req = urllib2.Request("http://blog.youkuaiyun.com/nevasun") 
fd = urllib2.urlopen(req) 
while True: 
data = fd.read(1024) 
if not len(data): 
break 
sys.stdout.write(data) 
import sys, urllib2

req = urllib2.Request("http://blog.youkuaiyun.com/nevasun")
fd = urllib2.urlopen(req)
while True:
data = fd.read(1024)
if not len(data):
break
sys.stdout.write(data)


在终端运行提示urllib2.HTTPError: HTTP Error 403: Forbidden,怎么回事呢?

这是由于网站禁止爬虫,可以在请求加上头信息,伪装成浏览器访问。添加和修改:

headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} 
req = urllib2.Request("http://blog.youkuaiyun.com/nevasun", headers=headers) 
headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
req = urllib2.Request("http://blog.youkuaiyun.com/nevasun", headers=headers)


再试一下,HTTP Error 403没有了,但是中文全都是乱码。又是怎么回事?

这是由于网站是utf-8编码的,需要转换成本地系统的编码格式:

import sys, urllib2 
headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} 
req = urllib2.Request("http://blog.youkuaiyun.com/nevasun", headers=headers) 
content = urllib2.urlopen(req).read() # UTF-8 

type = sys.getfilesystemencoding() # local encode format 
print content.decode("UTF-8").encode(type) # convert encode format 
import sys, urllib2


headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
req = urllib2.Request("http://blog.youkuaiyun.com/nevasun", headers=headers)
content = urllib2.urlopen(req).read() # UTF-8

type = sys.getfilesystemencoding() # local encode format
print content.decode("UTF-8").encode(type) # convert encode format

OK,大功告成,可以抓取中文页面了。下一步就是在GAE上做个简单的应用了~

### 如何使用Python编写爬虫程序来抓取含有中文内容的网页数据 为了实现这一目标,可以采用多种方法和技术栈组合。下面介绍一种基于`requests`库和`BeautifulSoup`库的方式来进行静态页面中的中文内容抓取;对于动态加载的内容,则可借助于`Selenium`工具。 #### 静态页面抓取方案 当目标网站是以HTML形式直接返回所需信息时,可以直接利用`requests.get()`函数发起HTTP请求获取整个页面源码,并通过设置合适的编码方式确保能正确处理中文字符: ```python import requests from bs4 import BeautifulSoup url = 'http://example.com' # 替换成实际的目标网址 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'} response = requests.get(url, headers=headers) if response.status_code == 200: content = response.content.decode('utf-8') # 假设服务器端采用了UTF-8编码发送响应体 else: raise Exception(f"Failed to load page {url}") soup = BeautifulSoup(content, "lxml") # 解析HTML文档结构 for tag in soup.find_all(['p', 'h1']): # 查找所有的<p>标签以及<h1> text = tag.text.strip() if any('\u4e00' <= char <= '\u9fff' for char in text): # 判断是否包含汉字 print(text) ``` 这段代码展示了如何向指定URL发出GET请求并接收其响应,随后运用正则表达式过滤出只含中文的文字节点[^2]。 #### 动态加载内容抓取方案 如果遇到AJAX异步更新或JavaScript渲染后的DOM元素变化情况下的复杂场景,单纯依靠上述手段可能无法满足需求。此时推荐引入浏览器自动化框架——`Selenium WebDriver`模拟真实用户的浏览行为直至完成全部资源下载后再进行分析操作: 安装必要的依赖包: ```bash pip install selenium beautifulsoup4 lxml ``` 准备ChromeDriver驱动文件并与本地环境变量关联好路径之后,在脚本里初始化WebDriver实例对象: ```python from selenium import webdriver from time import sleep from bs4 import BeautifulSoup driver_path = r'C:\path\to\chromedriver.exe' browser = webdriver.Chrome(executable_path=driver_path) try: browser.get('https://www.example.com') while True: try: element = browser.find_element_by_class_name("load-more-button") element.click() sleep(2) # 给予足够的时间让新内容完全呈现出来 html_source = browser.page_source break except NoSuchElementException as e: html_source = browser.page_source break finally: browser.quit() soup = BeautifulSoup(html_source,"lxml") # 同样地,这里也可以继续执行之前提到过的筛选逻辑... ``` 此部分说明了针对某些特殊类型的Web应用程序所采取的不同策略,即先启动无头模式下的Chromium进程访问待采集站点,再依据实际情况决定何时停止滚动条下拉动作从而获得完整的HTML片段供后续解析工作调用[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值