2023.07.01 | admin | 135次围观
向下翻会看到翻页的小图标:
假如我们要获取1-17页该页面上所有的字符串,如下所示:
应该如何做?
先给出代码(仅逻辑实现部分):
def parse(self, response):
divs = response.xpath("//div[@class='css-rv942s']")
for div in divs:
item = ThaiItem()
item['en'] = div.xpath("./span[@class='css-1sylyko']/a/text()").extract_first()
item['thai'] = div.xpath("./span[@class='css-epvm6']/span/div[@class='css-jiq801']/text()").extract_first()
yield item
# 获取字符串,构造下一页请求地址
next = response.xpath("//div[@class='css-x9n345']/div/a[last()]/@href").extract_first()
new_url = 'https://engoo.co.th' + next
yield scrapy.Request(url=new_url, callback=self.parse)
分析:构造获取下一页的请求很重要,要想办法得到下一页的请求。在这个例子中,下一页的请求永远在最后一个a标签的href属性中。
例如当前我们在第三页,看一下网页布局:
网页中蓝色部分的英文都是超链接,点击进入详情页:
如何通过首页进入到详情页并爬取其中的内容呢?见以下代码:
首先通过start_requests函数获取所有首页起始地址:
def start_requests(self):
# 获取全部翻页链接
for i in range(1, 17):
url = 'https://engoo.co.th/app/words/list/en/a?page=' + str(i)
yield scrapy.Request(url=url)
紧接着,获取首页上每个英文单词的超链接:
# 获取每页的url
def parse(self, response):
urls = response.xpath("//div[@class='css-rv942s']/span/a/@href").extract()
for url in urls:
url_new = "https://engoo.co.th" + url
yield scrapy.Request(url_new, callback=self.parse_item)
重要:通过start_requests函数得到起始地址后淘宝详情页去间隙代码,直接在parse函数获得url字符串淘宝详情页去间隙代码,拼接得到详情页的地址:url_new。详情页的内容通过Request发送到parse_item函数进行解析。
parse_item函数代码如下:
def parse_item(self, response):
divs_top = response.xpath("//div[@class='css-1p8520y']")
item = ThaiItem()
for div in divs_top:
en_text_l = div.xpath(".//div/span[@class='css-79elbk']/span//text()").extract()
en_text = ''.join(en_text_l)
item['en_text'] = en_text
item['thai_text'] = div.xpath(".//div[@class='css-79elbk']/span[@lang='th']/span/text()").extract_first()
# print(item)
yield item
divs_bot = response.xpath("//div[@class='css-kp3nri']")
for div in divs_bot:
item['en_text'] = div.xpath("./div[@class='css-nipsa6']/span[@class='css-35ezg3']/text()").extract_first()
item['thai_text'] = div.xpath("./div[@class='css-nipsa6']/span[@class='css-l3ddl3']/text()").extract_first()
# print(item)
yield item
最后将详情页的内容通过pipelines保存:
class ThaiPipeline:
def process_item(self, item, spider):
res = dict(item)
en_text = res['en_text']
thai_text = res['thai_text']
with open('save.txt', 'a', encoding='utf-8') as fw:
fw.write(en_text + '\t' + thai_text + '\n')
return item
反思:写作时思路很混乱,排版也比较粗糙,见谅,领会精神 > w < !!!
版权声明
本文仅代表作者观点。
本文系作者授权发表,未经许可,不得转载。
发表评论