点我看码云仓库

作业①

1)作业要求:指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。使用scrapy框架分别实现单线程和多线程的方式爬取。务必控制总页数(学号尾数2位)、总下载的图片数量(尾数后3位)等限制爬取的措施。
输出信息:
将下载的Url信息在控制台输出,并将下载的图片存储在images子文件中,并给出截图。

核心代码展示:
单线程:

class MySpider(scrapy.Spider):
    name = "weather_spider"
    allowed_domains = ['weather.com.cn']
    start_urls = ["http://www.weather.com.cn/"]
    page_count = 0  
    img_count = 0  

    def parse(self, response):
        try:
            data = response.body.decode()
            selector = scrapy.Selector(text=data)
            srcs = selector.xpath('//img/@src').extract()
            for src in srcs:
                item = ImgItem()
                item['src'] = src
                yield item
                self.img_count += 1
                if self.img_count >= 158:
                    self.crawler.engine.close_spider(self, reason="达到图片数量限制")

            links = selector.xpath("//a/@href")
            for link in links:
                url = response.urljoin(link.extract())
                yield scrapy.Request(url, callback=self.parse)
            self.page_count += 1
        except Exception as err:
            logging.error(f"解析页面出错: {err}")

多线程:

class MySpider(scrapy.Spider):
    name = "weather_spider"
    allowed_domains = ['weather.com.cn']
    start_urls = ["http://www.weather.com.cn/"]
    page_count = 0  
    img_count = 0  

    def parse(self, response):
        try:
            data = response.body.decode()
            selector = scrapy.Selector(text=data)
            srcs = selector.xpath('//img/@src').extract()
            for src in srcs:
                item = ImgItem()
                item['src'] = src
                yield item
                self.img_count += 1
                if self.img_count >= 158:
                    raise scrapy.exceptions.CloseSpider(reason="达到图片数量限制")

            links = selector.xpath("//a/@href")
            for link in links:
                url = response.urljoin(link.extract())
                yield scrapy.Request(url, callback=self.parse)
            self.page_count += 1
        except Exception as err:
            logging.error(f"解析页面出错: {err}")

运行图片展示:

2)心得体会:
这次爬取网站图片的作业很有挑战性。单线程爬取让我熟悉了scrapy基本流程,从请求到解析,每个环节都要精心控制,依据学号尾数限制页数和图片数量,明白了数据范围控制的重要性。多线程爬取则像开启了加速模式,速度虽快,但线程同步是个难题,如同指挥乐队需协调各方。无论是单线程还是多线程,输出Url信息和存储图片都让我深知数据处理和存储环节容不得差错,这次作业让我对scrapy运用更熟练。

作业②

1)作业要求:
熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取股票相关信息。
输出信息:

序号 股票代码 股票名称 最新报价 涨跌幅 涨跌额 成交量 成交额 振幅 最高 最低 今开 昨收
1 688093 N世华 28.47 62.22% 10.92 26.13万 7.6亿 22.34 32.0 28.08 30.2 17.55

核心代码展示:

    def parse(self, response):
        try:
            data = response.body.decode()
            datas = re.findall("{.*?}", data[re.search("\[", data).start():])  # 获取每支股票信息,一个{...}对应一支
            for n in range(len(datas)):
                stock = json.loads(datas[n])  # 文本解析成json格式
                item = StocksItem()  # 获取相应的变量
                item['code'] = stock['f12']
                item['name'] = stock['f14']
                item['latest_price'] = str(stock['f2'])
                item['range'] = str(stock['f3'])
                item['amount'] = str(stock['f4'])
                item['trading'] = str(stock['f5'])
                yield item
            all_page = math.ceil(eval(re.findall('"total":(\d+)', response.body.decode())[0]) / 20)  # 获取页数
            page = re.findall("pn=(\d+)", response.url)[0]  # 当前页数
            if int(page) < all_page:  # 判断页数
                url = response.url.replace("pn=" + page, "pn=" + str(int(page) + 1))  # 跳转下一页
                yield scrapy.Request(url=url, callback=self.parse)  # 函数回调
        except Exception as err:
            print(err)

运行图片展示:

2)心得体会:
作业②是爬取股票信息,让我深入理解scrapy数据处理。Item和Pipeline的使用就像打造数据处理流水线,规范数据格式至关重要。Xpath是从东方财富网或新浪股票提取数据的利器,需要仔细分析网页结构来编写表达式。设计MySQL数据库表结构存储数据也不容易,每个字段都要考虑周全。这个过程让我明白好的数据库设计对数据存储和分析的意义,成功获取并存储股票数据很有成就感。

作业③

1)作业要求:
熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取外汇网站数据。
输出信息:

CURRENCY TBP CBP TSP CSP TIME
阿联酋迪拉姆 198.58 192.31 199.98 206.59 11:27:14

核心代码展示:

class MySpider(scrapy.Spider):
    name = "currency"
    def __init__(self, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        chrome_options = Options()
        chrome_options.add_argument("--headless")
        self.driver = webdriver.Chrome(service=Service(r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"), options=chrome_options)

    def start_requests(self):
        url = 'https://www.boc.cn/sourcedb/whpj/'
        self.driver.get(url)
        time.sleep(1)
        html = etree.HTML(self.driver.page_source)
        yield scrapy.Request(url, self.parse, meta={'html': html})

    def parse(self, response):
        html = response.meta['html']
        lis = html.xpath('/html/body/div/div[5]/div[1]/div[2]/table/tbody/tr')
        number = 1
        for link in lis:
            if number!= 1:
                texts = link.xpath('./td[1]/text()')
                name = texts[0] if texts else ''
                texts = link.xpath('./td[2]/text()')
                TBP = texts[0] if texts else ''
                texts = link.xpath('./td[3]/text()')
                CBP = texts[0] if texts else ''
                texts = link.xpath('./td[4]/text()')
                TSP = texts[0] if texts else ''
                texts = link.xpath('./td[5]/text()')
                CSP = texts[0] if texts else ''
                texts = link.xpath('./td[8]/text()')
                TIME = texts[0] if texts else ''

                item = FourbloodItem()
                item["currency"] = name
                item["TBP"] = TBP
                item["CBP"] = CBP
                item["TSP"] = TSP
                item["CSP"] = CSP
                item["time"] = TIME
                yield item
            if number == 1:
                number += 1

    def closed(self, reason):
        self.driver.quit()

运行图片展示:


2)心得体会:
外汇网站数据爬取作业中,Item和Pipeline依旧关键,能清晰组织外汇数据。Xpath在中国银行网提取数据时,因外汇数据展示形式不同,需要重新探索HTML代码,这是个挑战。向MySQL存储数据的过程让我更熟悉数据库操作,每一条外汇数据都有价值。这次作业提升了我的技术能力,也让我感受到数据对金融领域的意义和编程获取信息的力量。

posted on 2024-11-04 21:22  吴鱼子  阅读(9)  评论(0编辑  收藏  举报