使用python 爬虫抓站的一些技巧总结
使用Python爬虫抓站的一些技巧总结
Python作为一种非常流行的编程语言,被广泛地应用于各个领域,其中爬虫技术在大数据、人工智能等领域中扮演着重要的角色。但是爬虫技术也有一些技巧和注意点需要掌握,本文将会对使用Python爬虫抓站的一些技巧进行总结。
一. 常见的爬虫框架
- Scrapy:Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。同时也可以用于数据挖掘和信息处理,并可以应用在广泛的领域中,例如数据挖掘,信息处理或存储历史数据等。因此,Scrapy 使用广泛,为用户提供了高效的Web爬取规划和即时数据提取的机制。
- Beautiful Soup:Beautiful Soup是一个使用Python进行网页解析的库。它可以将 HTML 和 XML 文件转化为解析树,通过遍历这个树来提取出所需要的信息。
二、编写爬虫的基本思路
- 分析网站结构,确定所需的数据;
- 通过网络请求爬取页面上的数据;
- 使用合适的库对数据进行解析、存储等操作;
- 对数据进行清洗和分析。
三、避免反爬机制
- 设置请求头:一般情况下,服务器会通过请求头来识别请求的来源。所以可以通过设置请求头中的User-Agent等参数来伪装成浏览器请求数据,从而避免被识别为爬虫程序。
- 降低爬取频率:如果请求的频率过高,一方面容易影响服务器的正常运行,另一方面也容易被服务器检测到是非正常请求。
- 使用代理IP:使用代理IP能够避免同一IP请求过于频繁,使得服务端不能正常运行从而封禁该IP的现象。在Python中可以使用requests库中的proxies参数来设置代理IP。
- 使用验证码自动识别技术:有些网站设置了验证码等反爬机制。为了避免这种情况,可以使用第三方的验证码识别服务来自动识别并输入验证码。
四、示例说明
示例1:使用requests+Beautiful Soup 对简书的文章进行爬取
1. 分析网站结构,确定所需的数据
我们需要爬取简书网站上的文章,因此我们需要去简书网站浏览页面,确定所需数据的网页元素位置和访问地址。
2. 通过网络请求爬取页面上的数据
在Python中我们可以使用 requests 库来完成网站数据的请求和响应,如下:
import requests
# 获取简书博客页面的HTML代码
url = "https://www.jianshu.com"
r = requests.get(url)
content = r.content.decode('utf-8')
3. 使用Beautiful Soup 对数据进行解析
通过Beautiful Soup库可以非常方便地解析网页中的HTML和XML代码,并且可以根据需要进行数据的提取和操作,如下:
from bs4 import BeautifulSoup
# 解析简书博客页面的HTML代码
soup = BeautifulSoup(content, "html.parser")
# 找到所有文章标题元素
titles = soup.find_all('a', {'class': 'title'})
# 输出文章标题
for title in titles:
print(title.string)
4. 对数据进行清洗和分析
对于爬取到的数据,如果不进行清洗和分析,很难达到我们预期的效果。例如对于获取到的文章内容,我们需要去除其中的HTML标签和空格等无用信息,只保留正文内容,可以通过如下方式进行清洗:
# 处理文章内容
for title in titles:
# 获取文章链接
link = "https://www.jianshu.com" + title.get("href")
text_r=requests.get(link)
# 解析网页 HTML 代码
soup_text = BeautifulSoup(text_r.content, 'html.parser')
# 获取文章内容
article_text = soup_text.find('p', {'class': 'show-content-free'}).get_text()
# 处理文章内容,去除无用字符
article_text = article_text.replace('\n', '').replace(' ', '')
# 输出文章内容
print(article_text)
示例2:使用 Scrapy 对京东商品进行爬取
1. 分析网站结构,确定所需的数据
我们需要爬取京东网站上的商品,因此我们需要去京东网站浏览页面,确定我们需要爬取的商品的网页元素位置和访问地址。
2. 使用 Scrapy 爬取京东商品
按照 Scrapy 爬虫的通用流程,我们将会新建一个 Scrapy 项目进行爬取:
# 1. 创建 Scrapy 项目
scrapy startproject jd
# 2. 创建爬虫类
cd jd
scrapy genspider jdbook book.jd.com
添加如下代码到京东 book.jd.com 上:
# 获取书籍列表
def parse(self, response):
# 遍历获取书籍标题、价格
for sel in response.xpath('//ul[@class="gl-warp clearfix"]/li'):
# 获取书籍标题和价格
title = sel.xpath('p/p/a/em/text()').extract()[0]
price = sel.xpath('p/p/strong/i/text()').extract()[0]
# 输出数据
print(title, price)
3. 对数据进行清洗和分析
对于爬取到的商品,我们可以通过 Scrapy 爬虫框架提供的特性对数据进行清洗和分析。例如可以将数据存储到数据库中、去重复等操作。这里我们将数据存储到csv文件中:
class JdbookSpider(scrapy.Spider):
def __init__(self, name=None, **kwargs):
super().__init__(name, **kwargs)
self.page = 1
# 书籍列表页
def start_requests(self):
url = "https://list.jd.com/list.html?cat=1713,3258,3305&page=%s"
urls = [url % i for i in range(1, 2)]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
# 获取书籍列表
def parse(self, response):
# 遍历获取书籍标题、价格
for sel in response.xpath('//ul[@class="gl-warp clearfix"]/li'):
# 获取书籍标题和价格
title = sel.xpath('p/p/a/em/text()').extract()[0]
price = sel.xpath('p/p/strong/i/text()').extract()[0]
# 保存数据到csv
with open('goods.csv', 'a', newline='') as file:
writer = csv.writer(file)
writer.writerow([title, price])
# 输出数据
print(title, price)
以上是对Scrapy爬虫框架进行简单的应用和说明, Scrapy 还有更丰富的特性和丰富的扩展,能够帮助我们更加轻松地完成爬虫任务。
五、总结
本文介绍了使用Python进行爬虫开发时常见的技巧和注意点。在实际使用中,我们应该根据不同的场景和数据需求选择合适的爬虫框架、合适的爬虫方法。如果存在反爬机制,我们可以通过一些技巧进行绕过;同时也需要注意爬取频率等细节问题。在进行数据清洗和分析时,应该根据具体需求选择适当的方式进行,不可盲目使用,否则会浪费大量时间和资源。