python beautifulsoup 抓取网页正文内容
2014-09-04 13:21
791 查看
最近要跟着同学做一个小项目,需要自己找语料库,于是我用python 的 beautifulsoup 和urllib 来抓取一些网页内容来做训练语料。现在写下来备忘,虽然还有些不足。
这里,我抓取的是凤凰军事的滚动新闻,点开后可以发现是一系列的新闻链接,所以接下来就分两个方面的工作,第一个是将这些新闻链接全部提取出来,保存文本。第二个是根据这些链接访问网页,抓取正文内容,再保存文本。
提取新闻链接
通过分析滚动新闻的网页源码,发现这些超链接都是在<div class = "main"> </div>标签之间(不同网站有不同的格式),用beautifulsoup来提取比较好,若用urllib容提取到其他url,不易区分。
我们在滚动新闻下方会发现有“下一页”和“前一天”的标签,于是我们的思路是:本页的url提取完,如果有“下一页”标签,就将其url拿出来访问,在提取url,若没有“下一页”标签,则取出“前一天”标签的url来访问,就这样循环往下提取url,直到你认为够用了为止。(我做了100次的循环,大约爬了3800个url)
代码如下:
不过得到的url文件有少量不相符的(不知为何),可以再写一个文件将他们去掉。新闻链接的url长度都是一致的,不相符的url或长或短。
在查找“上一页”和“下一页”标签时遇到了编码问题,还好解决了,如程序所示。
提取网页内容正文
有了上面的一系列的url,就可以提取内容了。
和上面一样,先看一下网页源码,确定正文内容都在哪些标签内。我们发现,正文内容都在<div id = "artical_real" class = "js_img_share_area"> </div>中间,然后用beautifulsoup来提取。(有些新闻是图片或视频,格式与文本不一样,我们去掉不管)
不过这里有两个trick,一是正文内容都在<p> </p>标签内,怎么把它取出来,二是有一些网页的<p> </p>还有其他标签,怎么去掉,下面的代码里有
代码如下:
总结
在运行时,程序常有卡住或是报错的情况,分析后发现或是网络不好,或是服务器不好,这时将程序重新运行一下就好了。当然,在url的文件里把那些已访问过的删掉,从最近一个未访问的url开始,还要在上面的代码中将i从最新的下标开始,以免覆盖原文件。
这里,我抓取的是凤凰军事的滚动新闻,点开后可以发现是一系列的新闻链接,所以接下来就分两个方面的工作,第一个是将这些新闻链接全部提取出来,保存文本。第二个是根据这些链接访问网页,抓取正文内容,再保存文本。
提取新闻链接
通过分析滚动新闻的网页源码,发现这些超链接都是在<div class = "main"> </div>标签之间(不同网站有不同的格式),用beautifulsoup来提取比较好,若用urllib容提取到其他url,不易区分。
我们在滚动新闻下方会发现有“下一页”和“前一天”的标签,于是我们的思路是:本页的url提取完,如果有“下一页”标签,就将其url拿出来访问,在提取url,若没有“下一页”标签,则取出“前一天”标签的url来访问,就这样循环往下提取url,直到你认为够用了为止。(我做了100次的循环,大约爬了3800个url)
代码如下:
#encoding=utf-8 #coding=utf-8 import urllib,urllib2 from bs4 import BeautifulSoup import re import os import string #得到url的list def get_url_list(purl): #连接 req = urllib2.Request(purl,headers={'User-Agent':"Magic Browser"}) page = urllib2.urlopen(req) soup = BeautifulSoup(page.read()) #读取标签 a_div = soup.find('div',{'class':'main'}) b_div = a_div.find('div',{'class':'left'}) c_div = b_div.find('div',{'class':'newsList'}) links4 = [] #得到url的list for link_aa in c_div: for link_bb in link_aa: links4.append(link_bb.find('a')) links4 = list(set(links4)) links4.remove(-1) links4.remove(None) return links4 #从list中找到想要的新闻链接 #找到要访问的下一个页面的url def get_url(links): url = [] url2 = '' url3 = '' url4 = '' i = 0 for link in links: if link.contents == [u'后一天']: continue #上一页 和 下一页 的标签情况比较复杂 #取出“上一页”标签的url(貌似不管用) if str(link.contents).find(u'/> ') != -1: continue #取出“下一页”标签的url if str(link.contents).find(u' <img') != -1: url2 = link.get("href") i = 1 continue if link.contents == [u'前一天']: url3 = link.get("href") continue url.append(link.get("href")) if(i == 1): url4 = url2 else: url4 = url3 return url , url4 def main(): link_url = [] link_url_all = [] link_url_all_temp = [] next_url = '' #开始的url purl = 'http://news.ifeng.com/listpage/4550/20140903/1/rtlist.shtml' link_url = get_url_list(purl) link_url_all , next_url = get_url(link_url) #做了100次循环 for i in range(100): link_url = get_url_list(next_url) link_url_all_temp , next_url = get_url(link_url) link_url_all = link_url_all + link_url_all_temp #将全部url存档 path = 'd:\\url.txt' fp = open(path,'w') for link in link_url_all: fp.write(str(link)+'\n') fp.close() if __name__ == '__main__': main()
不过得到的url文件有少量不相符的(不知为何),可以再写一个文件将他们去掉。新闻链接的url长度都是一致的,不相符的url或长或短。
在查找“上一页”和“下一页”标签时遇到了编码问题,还好解决了,如程序所示。
提取网页内容正文
有了上面的一系列的url,就可以提取内容了。
和上面一样,先看一下网页源码,确定正文内容都在哪些标签内。我们发现,正文内容都在<div id = "artical_real" class = "js_img_share_area"> </div>中间,然后用beautifulsoup来提取。(有些新闻是图片或视频,格式与文本不一样,我们去掉不管)
不过这里有两个trick,一是正文内容都在<p> </p>标签内,怎么把它取出来,二是有一些网页的<p> </p>还有其他标签,怎么去掉,下面的代码里有
代码如下:
#encoding=utf-8 #coding=utf-8 import urllib,urllib2 from bs4 import BeautifulSoup import re import os import string links = [] path = 'd:\\url3.txt' file = open(path,'r') #得到url for line in file: links = links + [line] file.close() print len(links) i = 1 for link in links: print link req = urllib2.Request(link,headers={'User-Agent':"Magic Browser"}) page = urllib2.urlopen(req) soup = BeautifulSoup(page.read()) a_div = soup.find('div',{'id':'artical_real'},{'class':'js_img_share_area'}) if a_div == None: continue b_div = a_div.find('div',{'id':'main_content'},{'class':'js_selection_area'}) if b_div == None: continue kk = b_div.findAll('p') if kk == []: continue ss = str(kk) ss = ''.join(ss) my_cn = re.sub('<span(.*?)</span>','',ss) my_cn = ''.join(my_cn) my_cn = re.sub('<a(.*?)</a>','',my_cn) my_cn = ''.join(my_cn) my_cn = re.sub('<strong>(.*?)</strong>','',my_cn) my_cn = ''.join(my_cn) my_cn = re.findall('<p>(.*?)</p>',my_cn) my_cn = ''.join(my_cn) pth = 'd:\\webcontext\\'+str(i)+'.txt' fp = open(pth,'w') fp.writelines(my_cn) fp.close() i = i + 1 page.close()
总结
在运行时,程序常有卡住或是报错的情况,分析后发现或是网络不好,或是服务器不好,这时将程序重新运行一下就好了。当然,在url的文件里把那些已访问过的删掉,从最近一个未访问的url开始,还要在上面的代码中将i从最新的下标开始,以免覆盖原文件。
相关文章推荐
- python基于BeautifulSoup实现抓取网页指定内容的方法
- Python_BeautifulSoup 抓取网页内容入门
- python基于BeautifulSoup实现抓取网页指定内容的方法
- Python_BeautifulSoup 抓取网页内容入门
- 【实例】python 使用beautifulSoup 抓取网页正文 以淘宝商品价格为例
- Python_BeautifulSoup 抓取网页内容入门
- python抓取网页内容示例分享
- python实现抓取网页上的内容并发送到邮箱
- 利用Python和Beautiful Soup抓取网页内容
- C#实现网页内容正文抓取
- paip.抓取网页内容--java php python
- 按示例学python:使用python抓取网页正文
- 利用Python和Beautiful Soup抓取网页内容
- [Python]网络爬虫(二):利用urllib2通过指定的URL抓取网页内容(转)
- C#实现网页内容正文抓取
- [Python]网络爬虫(二):利用urllib2通过指定的URL抓取网页内容
- python beautifulsoup多线程分析抓取网页
- Python抓取网页内容应用代码分析
- python beautifulsoup多线程分析抓取网页
- Python抓取网页&批量下载文件方法初探(正则表达式+BeautifulSoup)