爬虫抓取数据

首先:爬虫常用的模块有requestsBeautifulSouplxml,所以要先用pip安装对应的模块,注意BeautifulSoup已被移到bs4

Pip install lxml

Pip install bs4

BeautifulSoup是一个可以从HTMLXML文件中提取数据的Python.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间。可以参考两个网址:

英文:https://www.crummy.com/software/BeautifulSoup/bs4/doc/

中文:https://beautifulsoup.readthedocs.io/zh_CN/latest/

其次:要玩爬虫,还要懂一些html,因为要分析dom结构。

下面的例子将从新闻中获取两个东西,一个是热点新闻,一个是热搜新闻词,跟着我来:

1,  用浏览器打开新闻网址

2,  F12查看dom结构,发现热点要闻都是在一个<strong>的标记里。

image.png

3,  尝试一下看行不行

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import time

# headers是模拟浏览器
headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5",
              
"Accept": "text/plain", 'Connection': 'close'}

url =
"http://news.xxx.com/"

# requests.get将返回URL的html内容
r = requests.get(url, headers=headers)

# 将返回的hmtl内容交给BeautifulSoup去格式化
soup = BeautifulSoup(r.text, 'html.parser')

# 获取热点新闻
# 获取所有strong标记
for s in soup.find_all('strong'):
    time.sleep(
3)
   
# 获取strong标记下的a标记
   
a = s.find_all('a')
   
# 获取a标记中的文本
   
title = a[0].string
   
# 获取a标记中的链接发址
   
href = a[0].get('href')
   
print('%s%s%s' % (title, ' : ', href))

这里用到time.sleep(3),是每隔3秒获取一条新闻,虽然有headers模拟浏览器,但程序总是很快的,这样会引起服务器的察觉,你不是一个浏览器,是一个爬虫程序,可能会被屏蔽。相当于我们用程序模拟人工浏览网页的时间。点一条新闻看3秒,再去点开另一个条新闻。另外headers中加入'Connection': 'close' 有助于提高不会被发现是爬虫的机率,好多现有爬虫文章都没有用到这个

运行以上程序看看结果,发现可以获取到热点新闻:

image.png


4,接着继续看热搜新闻词的dom结构

image.png

这次试着按dom 结构的层次往下找:

<body>下面有一个DIV,它的IDbody

再往下一层,有个DIV,它的IDfocus-top

再往下一层,有个DIV,它的class l-right-col

再往下一层,有个DIV,它的classbd

 

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import time

# headers是模拟浏览器
headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5",
              
"Accept": "text/plain", 'Connection': 'close'}
url =
"http://news.xxxx.com/"
# requests.get将返回URL的html内容
r = requests.get(url, headers=headers)
# 将返回的hmtl内容交给BeautifulSoup去格式化
soup = BeautifulSoup(r.text, 'html.parser')
# 获取热搜新闻词
body = soup.body
# 获取 id 为 body 的 div层
div_1 = body.find('div', {'id': 'body'})
# 获取 id 为 focus-top 的 div层
div_2 = div_1.find('div', {'id': 'focus-top'})
# 获取 class 为 l-right-col 的 div层
div_3 = div_2.find('div', class_='l-right-col')
# 获取 class 为 bd 的 div层
div_4 = div_3.find('div', class_='bd')
# 在class 为 bd 的 div层里获取所有a链接
hotwords = div_4.find_all('a',target="_blank")
for h in hotwords:
    time.sleep(
3)
   
print '%s%s%s' % (h.text, ' : ', h.get('href'))

 

因为class是关键字,所以用class_ 。运行结果如下:

image.png

把这两个程序合并一起,完整的如下:

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import time

# headers是模拟浏览器
headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5",
               
"Accept": "text/plain", 'Connection': 'close'}
url =
"http://news.xxx.com/"
# requests.get将返回URL的html内容
r = requests.get(url, headers=headers)
# 将返回的hmtl内容交给BeautifulSoup去格式化
soup = BeautifulSoup(r.text, 'html.parser')

# 获取热点新闻
# 获取所有strong标记
for s in soup.find_all('strong'):
    time.sleep(
3)
   
# 获取strong标记下的a标记
   
a = s.find_all('a')
   
# 获取a标记中的文本
   
title = a[0].string
   
# 获取a标记中的链接发址
   
href = a[0].get('href')
   
print('%s%s%s' % (title, ' : ', href))
   
# 获取热搜新闻词
body = soup.body
# 获取 id 为 body 的 div层
div_1 = body.find('div', {'id': 'body'})
# 获取 id 为 focus-top 的 div层
div_2 = div_1.find('div', {'id': 'focus-top'})
# 获取 class 为 l-right-col 的 div层
div_3 = div_2.find('div', class_='l-right-col')
# 获取 class 为 bd 的 div层
div_4 = div_3.find('div', class_='bd')
# 在class 为 bd 的 div层里获取所有a链接
hotwords = div_4.find_all('a',target="_blank")
for h in hotwords:
    time.sleep(
3)
   
print '%s%s%s' % (h.text, ' : ', h.get('href'))

第一个超简单的爬虫就做完了,这里只是简单的将结果打印出来,至于结果数据要如何处理就看各位需要了。

声明:仅供学习参考



该文章对你有帮助吗,求分享转发: 分享到QQ空间 分享给QQ好友

 

 

粤ICP备19116230号
友情链接: 码农藏书阁 天天链