抓取网页新闻(学习机器学习算法,分为回归,分类,爬取一下 )

优采云 发布时间: 2022-01-03 13:15

  抓取网页新闻(学习机器学习算法,分为回归,分类,爬取一下

)

  作者简历地址:

  Python爬虫一步步爬取文章背景

  最近在学习机器学习算法,分为回归、分类、聚类等,学习过程中没有数据可以练习。我想爬取国内各大网站的新闻,通过训练,然后对未来的新闻做一个分类预测。在这样的背景下,我开始了我的爬虫之路。

  网站分析

  国内重大新闻摘要网站(待续):

  搜狐新闻:

  时政:http://m.sohu.com/cr/32/?page=2&_smuid=1qCppj0Q1MiPQWJ4Q8qOj1&v=2

社会:http://m.sohu.com/cr/53/?page=2&_smuid=1qCppj0Q1MiPQWJ4Q8qOj1&v=2

天下:http://m.sohu.com/cr/57/?_smuid=1qCppj0Q1MiPQWJ4Q8qOj1&v=2

总的网址:http://m.sohu.com/cr/4/?page=4 第一个4代表类别,第二个4代表页数

  网易新闻

  推荐:http://3g.163.com/touch/article/list/BA8J7DG9wangning/20-20.html 主要修改20-20

新闻:http://3g.163.com/touch/article/list/BBM54PGAwangning/0-10.html

娱乐:http://3g.163.com/touch/article/list/BA10TA81wangning/0-10.html

体育:http://3g.163.com/touch/article/list/BA8E6OEOwangning/0-10.html

财经:http://3g.163.com/touch/article/list/BA8EE5GMwangning/0-10.html

时尚:http://3g.163.com/touch/article/list/BA8F6ICNwangning/0-10.html

军事:http://3g.163.com/touch/article/list/BAI67OGGwangning/0-10.html

手机:http://3g.163.com/touch/article/list/BAI6I0O5wangning/0-10.html

科技:http://3g.163.com/touch/article/list/BA8D4A3Rwangning/0-10.html

游戏:http://3g.163.com/touch/article/list/BAI6RHDKwangning/0-10.html

数码:http://3g.163.com/touch/article/list/BAI6JOD9wangning/0-10.html

教育:http://3g.163.com/touch/article/list/BA8FF5PRwangning/0-10.html

健康:http://3g.163.com/touch/article/list/BD*敏*感*词*QSV3wangning/0-10.html

汽车:http://3g.163.com/touch/article/list/BA8DOPCSwangning/0-10.html

家居:http://3g.163.com/touch/article/list/BAI6P3NDwangning/0-10.html

房产:http://3g.163.com/touch/article/list/BAI6MTODwangning/0-10.html

旅游:http://3g.163.com/touch/article/list/BEO4GINLwangning/0-10.html

亲子:http://3g.163.com/touch/article/list/BEO4PONRwangning/0-10.html

  待续。 . .

  爬取过程的第一步:简单爬取

  在这个过程中,主要用到了两个包,urllib2和BeautifulSoup。以搜狐新闻为例,我们做了一个简单的爬虫,爬取内容没有任何优化问题,所以会出现假死的情况。

  # -*- coding:utf-8 -*-

'''

Created on 2016-3-15

@author: AndyCoder

'''

import urllib2

from bs4 import BeautifulSoup

import socket

import httplib

class Spider(object):

"""Spider"""

def __init__(self, url):

self.url = url

def getNextUrls(self):

urls = []

request = urllib2.Request(self.url)

request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; \

WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36')

try:

html = urllib2.urlopen(request)

except socket.timeout, e:

pass

except urllib2.URLError,ee:

pass

except httplib.BadStatusLine:

pass

soup = BeautifulSoup(html,'html.parser')

for link in soup.find_all('a'):

print("http://m.sohu.com" + link.get('href'))

if link.get('href')[0] == '/':

urls.append("http://m.sohu.com" + link.get('href'))

return urls

def getNews(url):

print url

xinwen = ''

request = urllib2.Request(url)

request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; \

WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36')

try:

html = urllib2.urlopen(request)

except urllib2.HTTPError, e:

print e.code

soup = BeautifulSoup(html,'html.parser')

for news in soup.select('p.para'):

xinwen += news.get_text().decode('utf-8')

return xinwen

class News(object):

"""

source:from where 从哪里爬取的网站

title:title of news 文章的标题

time:published time of news 文章发布时间

content:content of news 文章内容

type:type of news 文章类型

"""

def __init__(self, source, title, time, content, type):

self.source = source

self.title = title

self.time = time

self.content = content

self.type = type

file = open('C:/test.txt','a')

for i in range(38,50):

for j in range(1,5):

url = "http://m.sohu.com/cr/" + str(i) + "/?page=" + str(j)

print url

s = Spider(url)

for newsUrl in s.getNextUrls():

file.write(getNews(newsUrl))

file.write("\n")

print "---------------------------"

  第 2 步:遇到的问题

  在运行上述代码的过程中,会遇到一些问题,导致爬虫停止运行,速度变慢。这里有几个问题:

  第 3 步:解决方案

  代理服务器

  可以从网上找一些代理服务器,然后设置爬虫代理来解决IP问题。代码如下:

  def setProxy(pro):

proxy_support=urllib2.ProxyHandler({'https':pro})

opener=urllib2.build_opener(proxy_support,urllib2.HTTPHandler)

urllib2.install_opener(opener)

  关于状态问题,如果你找不到一个网页,就丢弃它,因为丢弃少量的网页不会影响你以后的工作。

  def getHtml(url,pro):

urls = []

request = urllib2.Request(url)

setProxy(pro)

request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; \

WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36')

try:

html = urllib2.urlopen(request)

statusCod = html.getcode()

if statusCod != 200:

return urls

except socket.timeout, e:

pass

except urllib2.URLError,ee:

pass

except httplib.BadStatusLine:

pass

return html

  至于速度慢的问题,可以采用多进程的方式进行爬取。解析URL后,可以在Redis中使用一个有序集作为队列,既解决了URL重复的问题,也解决了多进程的问题。 (尚未实施)

  第 4 步:运行

  昨晚试了一下,爬到搜狐新闻的一些网页。大概是50*5*15=3750多个网页,解析出2000多条新闻,网速接近1Mbps。 , 耗时 1101s,约 18 分钟。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线