python3爬取新闻网站的所有新闻-新手起步

来源:互联网 发布:c语言数组存储方式 编辑:程序博客网 时间:2024/06/06 02:54
该篇文章适用于新手,让大家在刚接触爬虫的时候少踩点坑。作者接触python也有几个月时间了,最近要用python做数据采集的工作,因此要用爬虫去爬取各大门户网站。

好了,废话不多说,直接切入正题。

(声明:我整个工作都是在windows下进行的。)

1.环境配置。

python就够了,关于windows下环境搭建,网上教程很多。

这里我附一个。(http://www.cnblogs.com/windinsky/archive/2012/09/20/2695520.html)

python环境确定搭建成功,就可以开始写程序去爬虫了。

2.要明确你所要爬取的网站结构。
(1)url

爬虫,实际上就是解析页面的url, 以及每个页面的标签元素(html那些)。因此,要先对你所要爬取的页面 url和内容的布局非常了解。

比如,我爬取的是凤凰网的所有新闻。 凤凰网上,大部分新闻正文的页面链接,都是这种形式,ifeng前面是新闻的分类,http://news.ifeng.com/a/20170623/51308599_0.shtml。

找到了规律,就可以用正则表达式把这些页面提取出来。

关于正则表达式的学习,网上也有很多教程。这里给大家附一个比较好的链接 http://www.jb51.net/article/57150.htm
(2)页面中的标签元素
我要提取的是新闻的标题和正文内容。 如前面所说,我找到了我想要的新闻页面,可以在浏览器里用F12, 来观察页面布局。
比如凤凰网新闻正文页面, 标题都在<div id='artical'>是<h1>标签, 正文都在<div id='main_content'>里, 是<p>标签。

3.写程序,调试运行。
这里用到了python的urllib, Beautifulsoup包。
我用的是python3, 3和2会有一些语法上的区别, 但是大体逻辑是一样的。
urllib负责对url的处理,主要是request, parse, error, 这几个模块。 负责对url发送请求,获取页面信息,error的处理。

Beautifulsoup负责对页面的解析,获取的页面是html树形结构, 通过findAll(), select(), get(), get_text()等函数即可很方便的获取到我们想要的内容。


4.最后,如果是想要获取整个门户网站的数据,则需要一些递归, 整个网站相当于一个图结构, dfs(深度优先遍历)是比较好的方法。

关于爬虫程序的书写,比较烦人的几点:

(1)不同页面url各不相同,越是大的门户网站,类别越多,总会有一些没看到,没考虑到的情况,有时候程序里判断不全面,就会报错; 相近的还有,页面标签,有些新闻正文页面布局也不太一样,用一个提取方法也就难以提取出来。 对于以上问题, 我们需要在程序里多写一些情况处理 if error,防止在爬取的时候报错 终止;

(2)编码问题, 这是我遇到最多,最棘手的问题尤其在爬虫的时候。 我是要抓取新闻,然后保存到txt中。可能有些页面会存在极个别特殊的字符,无法编码解码,经常导致程序意外终止。解决方法:对极个别难以处理的网站,在源头就把它筛选掉,抓取数据时,往往不在乎一两个页面的数据。

别人跟我说,python爬虫的特点是:简单,暴力,跟python语言风格一样。

#coding: utf-8import codecsfrom urllib import request, parsefrom bs4 import BeautifulSoupimport reimport timefrom urllib.error import HTTPError, URLErrorimport sys###新闻类定义class News(object):def __init__(self):self.url = None  #该新闻对应的urlself.topic = None #新闻标题self.date = None #新闻发布日期self.content = None  #新闻的正文内容self.author = None  #新闻作者###如果url符合解析要求,则对该页面进行信息提取def getNews(url):#获取页面所有元素html = request.urlopen(url).read().decode('utf-8', 'ignore')#解析soup = BeautifulSoup(html, 'html.parser')#获取信息if not(soup.find('div', {'id':'artical'})): return news = News()  #建立新闻对象page = soup.find('div', {'id':'artical'})if not(page.find('h1', {'id':'artical_topic'})): returntopic = page.find('h1', {'id':'artical_topic'}).get_text()  #新闻标题 news.topic = topicif not(page.find('div', {'id': 'main_content'})): return main_content = page.find('div', {'id': 'main_content'})   #新闻正文内容content = ''for p in main_content.select('p'):content = content + p.get_text()news.content = contentnews.url = url       #新闻页面对应的urlf.write(news.topic+'\t'+news.content+'\n')##dfs算法遍历全站###def dfs(url):global countprint(url)pattern1 = 'http://news\.ifeng\.com\/[a-z0-9_\/\.]*$'     #可以继续访问的url规则pattern2 = 'http://news\.ifeng\.com\/a\/[0-9]{8}\/[0-9]{8}\_0\.shtml$'  #解析新闻信息的url规则#该url访问过,则直接返回if url in visited:  returnprint(url)#把该url添加进visited()visited.add(url)# print(visited)try:#该url没有访问过的话,则继续解析操作html = request.urlopen(url).read().decode('utf-8', 'ignore')# print(html)soup = BeautifulSoup(html, 'html.parser')if re.match(pattern2, url):  getNews(url)# count += 1####提取该页面其中所有的url####links = soup.findAll('a', href=re.compile(pattern1))for link in links:print(link['href'])if link['href'] not in visited: dfs(link['href'])# count += 1except URLError as e:print(e)returnexcept HTTPError as e:print(e)return# print(count)# if count > 3: returnvisited = set()  ##存储访问过的urlf = open('ifeng/news.txt', 'a+', encoding='utf-8')dfs('http://news.ifeng.com/')
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩子老是去厕所大便怎么办 家人偷了我的钱怎么办 小孩打闹踢到要害怎么办 腿上汗毛孔没开都是点点怎么办 脸蛋澡巾擦破了怎么办 婴儿后背用擦澡巾擦红了怎么办 搓澡皮肤搓破了怎么办 搓背搓的脖子红痒怎么办 上班迟到1个小时怎么办 想家想的都哭怎么办 想学手艺被骗学费怎么办 小腿肚后面筋和肌肉压痛怎么办 尿道囗和屁股眼中间长疮怎么办? 2个多月的宝宝蛋蛋上有个包怎么办 幼儿园睡觉自己摸下身玩怎么办 猫猫打喷嚏有透明液体怎么办 夏季穿运动鞋出了脚气怎么办 脚底长了刺瘊子怎么办 凉鞋前面踢破了怎么办 尖头鞋前面折了怎么办 月子里宝宝蛋蛋破皮怎么办 军人在训练时想上侧所怎么办 被白蚂蚁咬了怎么办 被蚂蚁咬了起包怎么办 脚踢了石头肿了怎么办 脚大拇指踢肿了怎么办 被骨头咯到了疼怎么办 被开水烫着了疼怎么办 鞋子上踩了口香糖怎么办 鞋底踩到口香糖干了怎么办 鞋子不小心踩到口香糖怎么办 站久了膝盖痛怎么办 站久了脚底板痛怎么办 蛇疮好了以后痛怎么办 站久了脚趾痛怎么办 心脏被踢了一脚怎么办 从马背上摔下来怎么办 小孩蛋蛋碰撞后有积液怎么办 小孩蛋蛋大小不一样有积液怎么办 对派出所的笔录不服怎么办 蛋蛋让尿淹了发红有小红瘩达怎么办