笔者是python3.6+pycharm的环境
爬取书目的网址是:http://books.toscrape.com 该网站是专门提供给爬虫初学者爬取的网站。
- 安装scrapy:任何系统都可以使用pip安装scrapy框架
>pip install scrapy
#安装成功后查看版本信息
>scrapy version
Scrapy 1.5.1
#笔者的scrapy版本是1.5.1
- 开始一个项目:
#命令为:scrapy startproject [SpiderName]
>scrapy startproject scrapy_books
#创建了一个名称为scrapy_books的爬虫
#查看结构,/f参数是递归显示
>tree /f scrapy_books
D:\PYTHON36\SCRAPY_BOOKS\SCRAPY_BOOKS
│ items.py
│ middlewares.py
│ pipelines.py
│ settings.py
│ __init__.py
│
├─spiders
│ │ __init__.py
│ │
│ └─__pycache__
└─__pycache__
- 各个py文件的简单说明:
item.py:保存爬取到数据的容器。
middlewares.py:中间件,处理request对象和response对象。
pipelines.py:管道模块,处理python处理好的数据。
settings.py:scrapy爬虫的一些配置。
spiders:爬虫模块,爬取解析数据。
- 简单的网页分析:
进入网站,打开开发者模式:
有一千本书,共分为20页
找到翻页按钮,审查该元素:发现有下一页的链接,注意一个问题第二页的next链接与后面的翻页链接多了catalogue这个词,写代码时应该考虑到
分别找到书名和价格的位置
-
开始coding:
- 在spiders目录下建立一个新的python文件,用于写元素筛选和url爬取代码
- 在其中添加如下代码:
import scrapy from bs4 import BeautifulSoup #将利用BeautifulSoup进行解析 class BookSpiders(scrapy.Spider): #继承Spider name = "BOOKS" #这是爬虫的唯一标识 start_urls = ["http://books.toscrape.com"] #开始爬取的网址,必须放在start_urls中 def parse(self, response): soup = BeautifulSoup(response.text, "html.parser", from_encoding='utf-8') one_page_books = soup.find_all('li') for book in one_page_books: try: book_title_label = book.find("h3") title = (book_title_label.find('a')).get('title') #获取书名 book_price_label = book.find('div', "product_price") price = book_price_label.find('p', "price_color").get_text() #获取价格 yield {'title':title, 'price':price,} #提交一次结果 except Exception: continue next_url = soup.find('li', 'next').find('a').get('href') url = "http://books.toscrape.com/catalogue/" if next_url: #如果不为空,则继续爬取 #注意只有第二页的next_url有catague字段,故做分割 next_url = next_url.split("/")[-1] #分割取末尾 即page-2.html格式 next_url = url + next_url #拼接成为完整的网址 yield scrapy.Request(next_url,callback=self.parse) #提交请求
- 在spiders目录下建立一个新的python文件,用于写元素筛选和url爬取代码
-
启动scrapy爬虫:
#在终端启动爬虫
>scrapy crawl books -o books.csv
#启动名为books的爬虫并将爬取的结果输出到文件books.csv中
- 爬取效果: