作业①:
-
要求:指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(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路径在上方代码展现)



- 法一