Scrapy+Urllib爬取新书热销榜

首页 » 爬虫 » Scrapy+Urllib爬取新书热销榜

介绍: Scrapy是python领域的爬虫开发框架, 里面已经完成爬虫程序大部分所需的通用工具.

给我的感觉就是使用Urllib爬取数据需要注意代码书写、网站格式等乱七八糟的问题,而使用Scrapy只需要考虑使用什么模版,对面网站的数据格式等等,减去了不必要的担心,它还有很多中间件,提高了爬虫的效率

据说: 这个Scrapy安装比较麻烦,它需要依赖很多库, 所以你们下载的时候注意下, 不过我要夸一下我的小苹果, 一路安装没有报任何错误,嘎嘎


作为一名知识青年, 读书是每天少不了的事, 所以我就打算爬一下京东的图书商品信息, 可是,当我一切都准备好的时候发现它是乱码的,我已经设置好编码了,还是乱的, 没办法了,就先爬一下当当的图书商品,以后有时间再看看京东的问题.

首先先看一下该网站的布局

Scrapy+Urllib爬取新书热销榜
  1. 点击网页初始只显示一级分类的地址, 二级分类是不显示的,只有点击了一级分类才能显示二级分类的地址
  2. 点击二级分类后会出现一页该分类的内容,这里需要解决自动翻页的问题
  3. 获取每一页的图书地址, 对每一个地址进行爬取,获取想要的数据

首先需要解决一级分类的问题

Scrapy+Urllib爬取新书热销榜

然后通过进入一级分类地址获取二级分类地址

Scrapy+Urllib爬取新书热销榜

有了这些二级分类地址,我们可以进去获取里面的内容,在获取之前,我们需要解决一下翻页问题

  1. 获取二级分类总页数
  2. 通过总页数进行循环达到自动翻页

第一步:获取总页数

Scrapy+Urllib爬取新书热销榜

然后分析网址发现它是通过recent7-0-0-1-x来进行翻页,下图是翻页结果

Scrapy+Urllib爬取新书热销榜

最终结果: 接下来就是对每一个图书进行提取数据了, 提取的数据可以放在本地也可以存入数据库

Scrapy+Urllib爬取新书热销榜

使用命令创建Scrapy项目

Scrapy+Urllib爬取新书热销榜

这个jd是我本来打算爬京东的, 后来发现爬不了, 就爬了当当.

# -*- coding: utf-8 -*-
import ssl
import pymysql
import scrapy
import urllib.request
import re
import random
from jd.items import JdItem


class GoodsSpider(scrapy.Spider):
    name = 'goods'
    allowed_domains = ['dangdang.com']

    # start_urls = ['http://dangdang.com']
    def start_requests(self):
        try:
            ssl._create_default_https_context = ssl._create_unverified_context

            ua = [
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36",
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.4 Safari/605.1.15",
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
            ]
            req1 = urllib.request.Request(
                "http://bang.dangdang.com/books/newhotsales/01.41.70.00.00.00-recent7-0-0-1-1")
            req1.add_header("User-Agent", random.choice(ua))
            allpddata = urllib.request.urlopen(req1).read().decode("gbk", "ignore")
            pat1 = '<div class="side_nav" category_path="(.*?)"'
            allpd = re.compile(pat1).findall(allpddata)
            pat2 = '>(.*?)</a><span class="icon"></span>'
            allname = re.compile(pat2).findall(allpddata)
            print("新书热卖榜")
            for i in range(0, len(allpd)):
                try:
                    thisip = "http://bang.dangdang.com/books/newhotsales/" + allpd[i] + "-recent7-0-0-1-1"
                    req2 = urllib.request.Request(thisip)
                    req2.add_header("User-Agent", random.choice(ua))
                    pddata = urllib.request.urlopen(req2).read().decode("gbk", "ignore")
                    pat3 = '<li class=""><a href="(.*?recent7-0-0-1-)1"'
                    zi_pd = re.compile(pat3).findall(pddata)
                    pat4 = '<li class=""><a href=".*?">(.*?)<'
                    zi_pd_name = re.compile(pat4).findall(pddata)
                    print("当前频道:" + allname[i])
                    for j in range(0, len(zi_pd)):
                        try:
                            print("当前子频道:" + zi_pd_name[j])
                            url1 = zi_pd[j] + "1"
                            req3 = urllib.request.Request(url1)
                            req3.add_header("User-Agent", random.choice(ua))
                            pagedata = urllib.request.urlopen(req3).read().decode("gbk", "ignore")
                            pat5 = '</a><span class="or">1</span><span>/(.*?)<'
                            pagenum = re.compile(pat5).findall(pagedata)
                            # print(zi_pd_name[j]+" 总页数:"+pagenum[0])
                            for y in range(1, int(pagenum[0]) + 1):
                                try:
                                    print("第" + str(y) + "页")
                                    url = zi_pd[j] + str(y)
                                    req4 = urllib.request.Request(url)
                                    req4.add_header("User-Agent", random.choice(ua))
                                    pagedatas = urllib.request.urlopen(req4).read().decode("gbk", "ignore")
                                    pat6 = '<div class="pic"><a href="(.*?)"'
                                    books = re.compile(pat6).findall(pagedatas)
                                    pat7 = '<div class="name"><a href=.*?>(.*?)<'
                                    bookname = re.compile(pat7).findall(pagedatas)
                                    for k in range(0, len(bookname)):
                                        try:
                                            item = JdItem()
                                            # print("书名:" + bookname[k])
                                            # print("地址:" + books[k])
                                            req5 = urllib.request.Request(books[k])
                                            req5.add_header("User-Agent", random.choice(ua))
                                            bookdata = urllib.request.urlopen(req5).read().decode("gbk", "ignore")
                                            pat8 = '<h1 title="(.*?)"'
                                            booksname = re.compile(pat8).findall(bookdata)
                                            pat9 = 'dd_name="作者">(.*?)<'
                                            bookzuozhe = re.compile(pat9).findall(bookdata)
                                            pat10 = 'dd_name="出版社">(.*?)<'
                                            chubanshe = re.compile(pat10).findall(bookdata)
                                            pat11 = '<span class="yen">&yen;</span>(.*?)<'
                                            youhuijia = re.compile(pat11).findall(bookdata)
                                            item["name"] = booksname[0]
                                            item["price"] = youhuijia[0]
                                            item["price2"] = youhuijia[1]
                                            item["zuozhe"] = bookzuozhe[0]
                                            item["pub"] = chubanshe[0]
                                            yield item
                                            # db = pymysql.connect("47.96.***.15", "root", "******", "pachong")
                                            # cursor = db.cursor()
                                            # sql="INSERT INTO books(书名,作者,原价,优惠价,出版社)VALUES('%s','%s','%s','%s','%s')"
                                            # cursor.execute(sql%(str(bookname[0]),str(bookzuozhe[0]),str(youhuijia[0]),str(youhuijia[1]),str(chubanshe[0])))
                                            # cursor.close()
                                            # db.close()
                                        except Exception as err:
                                            pass
                                except Exception as err:
                                    pass
                        except Exception as err:
                            pass
                except Exception as err:
                    pass

        except Exception as err:
            print(err)

            #     yield Request(books[k], callback=self.parse)

    def parse(self, response):
        pass

 

代码不规范, 有时间再改吧,我就是想分析一下别人家的网站,挺好玩的.嘎嘎

分享到:
赞(2) 打赏

评论 8

评论前必须登录!

 

  1. #1

    以后多多交流

    笨鸟先飞8个月前 (03-27)
  2. #2

    不错

    你哥8个月前 (03-27)
  3. #3

    可以

    笔记本8个月前 (03-28)
  4. #4

    good厉害了

    笔记本8个月前 (03-28)
  5. #5

    可以

    白云6个月前 (05-26)
  6. #6

    可以

    笨鸟先飞6个月前 (05-26)
  7. #7

    奥利给

    白云6个月前 (05-26)
  8. #8

    good厉害了

    沥青6个月前 (05-26)

觉得文章有用就打赏一下弟弟吧

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.5主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
正在播放:

作者想对您说:

累了就停下来听首歌吧

听完后会给您一个好心情

最后

等到您不容易

还希望您能多待一会儿

      00:00/00:00