数据采集与融合技术实验作业三

发布时间 2023-10-20 14:58:00作者: Chen'coke

作业①:

  • 要求:指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。使用scrapy框架分别实现单线程和多线程的方式爬取。
    –务必控制总页数(学号尾数2位)、总下载的图片数量(尾数后3位)等限制爬取的措施。

  • 主要代码

 def parse(self, response):
        try:
            dammit = UnicodeDammit(response.body, ["utf-8", "gbk"])
            data = dammit.unicode_markup
            selector = scrapy.Selector(text=data)
            img_list = selector.xpath("//img/@src")
            post_url = selector.xpath("//a/@href")
            for s in img_list:
                item = Demo3Point1Item()
                if self.img_num == 138:
                    break
                if s.extract():
                    self.img_num += 1
                    item["img_url"] = "https://weather.cma.cn" + s.extract()

                    # print(self.img_num,"https://weather.cma.cn" + s.extract())
                yield item
            for i in post_url:
                if self.img_num == 138:
                    break
                url =  i.extract()
                if 'web' in url:
                    nexturl = "https://weather.cma.cn" + url
                    yield scrapy.Request(url=nexturl, callback=self.parse)
        except Exception as err:
            print(err)
  • 输出信息:


  • Gitee文件夹链接
    题一

  • 心得体会
    在跳转页面时需注意保存该网页地址,并且在下载图片时注意处理图片的格式,否则会出现下载错误或下载网址出错问题

作业②

  • 要求:熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取股票相关信息。
    候选网站:东方财富网:https://www.eastmoney.com/

  • 主要代码

 def parse(self, response):
        try:
            dammit = UnicodeDammit(response.body, ["utf-8", "gbk"])
            r = dammit.unicode_markup
            pat = '\[\{(.*?)\}\]'
            data = re.compile(pat, re.S).search(r).groups()
            datas = data[0].split('},{')
            lists = []
            for i in datas:
                str1 = r'"(\w)+":'
                list = re.sub(str1, " ", i)  # 将key替换为空格
                list = list.split(",")
                lists.append(list)
            for i in lists:
                myspider.index += 1
                # id,code ,name,newprice ,rf,rfnum,donum,doprice,rise ,maxp,minp,todayp,yesterdayp
                item = Demo3Point2Item()
                item["id"] = str(myspider.index)
                item["code"] = i[11][2:-1]
                item["name"] = i[13][2:-1]
                item["newprice"] = i[1]
                item["rf"] = i[2]
                item["rfnum"] = i[3]
                item["donum"] = i[4]
                item["doprice"] = i[5]
                item["rise"] = i[6]
                item["maxp"] = i[14]
                item["minp"] = i[15]
                item["todayp"] = i[16]
                item["yesterdayp"] = i[17]
                yield item
        except Exception as err:
            print(err)
  • 输出信息

  • Gitee文件夹链接
    题二

  • 心得体会
    使用xpath进行查找时,返回页面为空,页面是动态的,采用抓包的方式读取处理json串,获取数据

作业③:

  • 要求:熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取外汇网站数据。
    候选网站:中国银行网:https://www.boc.cn/sourcedb/whpj/

  • 主要代码

    def parse(self, response):
        dammit = UnicodeDammit(response.body, ["utf-8", "gbk"])
        data = dammit.unicode_markup
        selector = scrapy.Selector(text=data)
        #法二
        lists = selector.xpath("//html/body/div/div[@class='BOC_main']/div[1]/div[2]/table/tr")
        # 网页复制xpath路径 错误(浏览器自动添加tbody以及对div进行排序)
        # /html/body/div/div[5]/div[1]/div[2]/table/tbody/tr[2]
        # 法一
        # lists = selector.xpath("//table")[1].xpath("./tr")
        count = 0
        # name,tbp,cbp,tsp,csp,time
        for i in lists:
            # print(i.extract())
            if count == 1:
                item = Demo3Point3Item()
                item["name"] = i.xpath("./td[1]/text()").extract_first()
                item["tbp"] = i.xpath("./td[2]/text()").extract_first()
                item["cbp"] = i.xpath("./td[3]/text()").extract_first()
                item["tsp"] = i.xpath("./td[4]/text()").extract_first()
                item["csp"] = i.xpath("./td[5]/text()").extract_first()
                item["time"] = i.xpath("./td[8]/text()").extract_first()
                yield  item
            else:
                count +=1
  • 输出信息

  • Gitee文件夹链接
    题三

  • 心得体会
    在对该网页进行处理时,使用网页复制的完整的xpath路径进行查找,返回结果none。

    • 法一
      可采用仅对table查找,获取数据,可以成功查找。
    • 法二
      检查网页源码,发现实际上网页复制的完整的xpath路径实际上是错误的,浏览器在对table进行处理时,自动添加了tbody元素,并且自动对div进行了排序,所以实际xpath路径出错,参照源码进行修正,即可正常爬取。(xpath路径在上方代码展现)