当前位置:   article > 正文

Python 爬虫从入门到精通

Python 爬虫从入门到精通

一、爬虫简介

爬虫用来自动获取网络上信息。Python因其丰富的第三方库和易读性,成为了爬虫开发的热门选择。

二、环境配置与基本工具

1. Python环境配置

安装Python3.x版本并配置好环境。

Download Python | Python.org

2. 常用库介绍

  • requests:用于处理HTTP请求的库,可以发送GET、POST等请求并获取响应数据。
  • BeautifulSoup:用于解析HTML或XML文件的库,可以提取页面元素。
  • lxml:高性能的HTML和XML解析库,也可用于BeautifulSoup的解析器。
  • Scrapy:成熟的爬虫框架,可以快速构建爬虫项目。

3. 安装库

  1. pip install requests
  2. pip install beautifulsoup4
  3. pip install lxml
  4. pip install scrapy

三、基本概念与实例

1. HTTP请求

爬虫主要通过HTTP协议与服务器进行通信,常用的请求方法有GET和POST。

示例代码:

  1. import requests
  2. url = 'https://www.example.com'
  3. response = requests.get(url)
  4. print(response.status_code) # 输出状态码
  5. print(response.text) # 输出响应内容

2. HTML解析

为了提取页面中的信息,我们需要解析HTML代码。BeautifulSoup是一个易用且功能强大的HTML解析库。

示例代码:

  1. from bs4 import BeautifulSoup
  2. html = '''
  3. <html>
  4. <head>
  5. <title>示例网页</title>
  6. </head>
  7. <body>
  8. <h1>欢迎来到示例网页</h1>
  9. <p>这是一个段落。</p>
  10. <a href="https://www.example.com/page2">链接到第二页</a>
  11. </body>
  12. </html>
  13. '''
  14. soup = BeautifulSoup(html, 'lxml')
  15. title = soup.title.string # 获取标题
  16. h1 = soup.h1.string # 获取h1标签的内容
  17. link = soup.a['href'] # 获取链接地址
  18. print(title)
  19. print(h1)
  20. print(link)

3. 实战:爬取豆瓣电影Top250

  1. import requests
  2. from bs4 import BeautifulSoup
  3. headers = {
  4. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36'
  5. }
  6. def get_movie_info(url):
  7. response = requests.get(url, headers=headers)
  8. soup = BeautifulSoup(response.text, 'lxml')
  9. movie_list = soup.find('ol', class_='grid_view')
  10. if movie_list is None:
  11. print("未找到电影列表")
  12. return
  13. for movie in movie_list.find_all('li'):
  14. rank = movie.find('em').string
  15. title = movie.find('span', class_='title').string
  16. rating = movie.find('span', class_='rating_num').string
  17. link = movie.find('a')['href']
  18. print(f"排名:{rank}")
  19. print(f"电影名称:{title}")
  20. print(f"评分:{rating}")
  21. print(f"链接:{link}")
  22. print("-------")
  23. def main():
  24. base_url = "https://movie.douban.com/top250?start="
  25. for i in range(0, 250, 25):
  26. url = base_url + str(i)
  27. print(f"正在爬取第{i // 25 + 1}页")
  28. get_movie_info(url)
  29. if __name__ == '__main__':
  30. main()

四、进阶爬虫技巧

1. 异常处理

使用Python的try-except语句来处理异常。

示例代码:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. def get_page(url):
  4. try:
  5. response = requests.get(url)
  6. if response.status_code == 200:
  7. return response.text
  8. except requests.RequestException:
  9. print("请求失败")
  10. return None
  11. def parse_page(html):
  12. try:
  13. soup = BeautifulSoup(html, 'lxml')
  14. title = soup.title.string
  15. print(title)
  16. except Exception as e:
  17. print(f"解析失败: {e}")
  18. def main():
  19. url = "https://www.example.com"
  20. html = get_page(url)
  21. if html:
  22. parse_page(html)
  23. if __name__ == '__main__':
  24. main()

2. 多线程爬虫

当爬取大量数据时,可以使用多线程提高爬虫效率。Python的threading库可以帮助我们实现多线程爬虫。

示例代码:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import threading
  4. headers = {
  5. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36'
  6. }
  7. def get_movie_info(url):
  8. response = requests.get(url, headers=headers)
  9. soup = BeautifulSoup(response.text, 'lxml')
  10. movie_list = soup.find('ol', class_='grid_view')
  11. if movie_list is None:
  12. print("未找到电影列表")
  13. return
  14. for movie in movie_list.find_all('li'):
  15. rank = movie.find('em').string
  16. title = movie.find('span', class_='title').string
  17. rating = movie.find('span', class_='rating_num').string
  18. link = movie.find('a')['href']
  19. print(f"排名:{rank}")
  20. print(f"电影名称:{title}")
  21. print(f"评分:{rating}")
  22. print(f"链接:{link}")
  23. print("-------")
  24. def run(start):
  25. url = f"https://movie.douban.com/top250?start={start}"
  26. get_movie_info(url)
  27. def main():
  28. threads = []
  29. for i in range(0, 250, 25):
  30. t = threading.Thread(target=run, args=(i,))
  31. threads.append(t)
  32. t.start()
  33. for t in threads:
  34. t.join()
  35. if __name__ == '__main__':
  36. main()

五、Scrapy框架入门

1. 创建Scrapy项目

首先,使用以下命令创建一个Scrapy项目:

scrapy startproject myspider

这将创建一个名为myspider的Scrapy项目,项目结构如下:

  1. myspider/
  2. scrapy.cfg
  3. myspider/
  4. __init__.py
  5. items.py
  6. middlewares.py
  7. pipelines.py
  8. settings.py
  9. spiders/
  10. __init__.py

2. 定义Item

items.py文件用于定义需要爬取的数据结构。在本例中,我们将爬取豆瓣电影Top250的数据。

修改items.py如下:

  1. import scrapy
  2. class DoubanMovieItem(scrapy.Item):
  3. rank = scrapy.Field()
  4. title = scrapy.Field()
  5. rating = scrapy.Field()
  6. link = scrapy.Field()

3. 编写爬虫

spiders目录下创建一个名为douban_spider.py的文件,编写爬虫代码:

  1. import scrapy
  2. from ..items import DoubanMovieItem
  3. class DoubanSpider(scrapy.Spider):
  4. name = 'douban'
  5. allowed_domains = ['movie.douban.com']
  6. start_urls = [f'https://movie.douban.com/top250?start={i}' for i in range(0, 250, 25)]
  7. def parse(self, response):
  8. movie_list = response.css('ol.grid_view li')
  9. for movie in movie_list:
  10. item = DoubanMovieItem()
  11. item['rank'] = movie.css('em::text').get()
  12. item['title'] = movie.css('span.title::text').get()
  13. item['rating'] = movie.css('span.rating_num::text').get()
  14. item['link'] = movie.css('div.hd a::attr(href)').get()
  15. yield item

4. 数据存储和反爬

Scrapy支持将爬取到的数据保存到多种格式,如JSON、CSV等。在本例中,我们将数据保存为JSON文件。

settings.py文件中,添加以下设置:

  1. FEED_FORMAT = 'json'
  2. FEED_URI = 'douban_top250.json'
  3. USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0'
  4. DOWNLOAD_DELAY = 3

5. 运行爬虫

在项目根目录下执行以下命令,启动爬虫:

scrapy crawl douban

运行完成后,在项目根目录下会生成一个名为douban_top250.json的文件,其中包含了爬取到的数据。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/470971
推荐阅读
相关标签
  

闽ICP备14008679号