作业①
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存储数据的过程让我更熟悉数据库操作,每一条外汇数据都有价值。这次作业提升了我的技术能力,也让我感受到数据对金融领域的意义和编程获取信息的力量。