python爬虫:xpath爬取静态网页

关于爬虫我原来用的一直是pyquery解析库,最近尝试了一下xpath,发现它真的很强大。
下面是一个xpath的一个小栗子。
在这里插入图片描述
这是一个题库的网址,我们要做的就是把所有的题目和答案爬取下来,一共是16页。
先用request获取页面的html看一下。

response = requests.get("http://syszr.hfut.edu.cn/redir.php?catalog_id=6&tikubh=4200&cmd=learning")
print(response.text.encode("latin1").decode("gbk"))

在这里插入图片描述
嗯,是可以直接爬下来的,没有任何反爬措施。那我们需要做的部分就只是解析网页了。(ps. 加上encode(“latin1”).decode(“gbk”)是为了防止中文乱码)
接下来是具体的步骤。

导入库

import requests   
from lxml import etree

lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。

构造URL

因为我们一共要爬取16页的内容,每一页url的设计肯定是有规律的。根据这个规律构造url,就不需要一页页地手动爬取了。
切换到第二页,url如下。
在这里插入图片描述
第三页。
在这里插入图片描述
已经发现规律了吧。每个url除了page页数的不同,其他都是一样的。
将page作为一个参数构造url如下。

URL = "http://syszr.hfut.edu.cn/redir.php?catalog_id=6&cmd=learning&tikubh=4200&page={page}" 

爬取页面

def scrape_index(page):
    url = URL.format(page=page)
    response = requests.get(url)
    return response

这里定义了一个爬取每一页的函数,将page作为参数传进去。

解析网页

TOTAL_PAGE = 16
questions = []
answers = []
for page in range(1, TOTAL_PAGE + 1):
    response = scrape_index(page)
    html = etree.HTML(response.text.encode("latin1").decode("gbk"))
    q = html.xpath('//*[@id="shiti-content"]/div/h3')
    a = html.xpath('//*[@id="shiti-content"]//span')
    for item in q:
        questions.append(item.text)
    for item in a:
        answers.append(item.text.replace("\r\n", ''))

这是代码最主要的部分,其实也就几行而已。我们首先定义了一个总的页数TOTAL_PAGE,然后通过for循环依次爬取所有的页面。questions和answers两个list分别用来保存获得的解析出来的数据。
接下来我们重点讲一下xpath解析的部分。
先回到原来的网页,打开开发者模式,定位到我们想要的元素。
在这里插入图片描述
可以看到题目由h3元素表示,答案用span元素表示。通过右键,选择Copy->Copy XPath,可以获得当前元素的xpath表达式。
在这里插入图片描述
获得的表达式如下。

//*[@id="shiti-content"]/div[1]/h3

如果我们直接通过这个表达式解析元素,获得的结果就只有一条。因为它匹配的是div元素列表中第一个元素下的h3元素。我们将它改成"//*[@id=“shiti-content”]/div/h3"就可以匹配到div下的所有h3元素。“//”表示从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
右键复制得到当前span元素的xpath表达式如下。

//*[@id="shiti-content"]/span[1]

同理,这里的span[1]表示取列表中的第一个元素。我们把它改成span就可以取到所有元素了。
以下列出了一些常用的xpath路径表达式。
https://www.w3school.com.cn/xpath/xpath_syntax.asp.
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
最后来看一下结果。
在这里插入图片描述
在这里插入图片描述
OK,完成。还有个小问题要注意一下,xpath解析出来的内容有时会包含"\r\t"等符号,我们用replace函数将它替换掉就可以了。

  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Scrapy是一个强大的Python爬虫框架,可以帮助你轻松地爬取静态网页多页数据。以下是一个简单的示例代码,可以帮助你开始: 首先,你需要创建一个新的Scrapy项目。在命令行中输入以下命令: ``` scrapy startproject myproject ``` 接下来,创建一个新的Spider。在项目的根目录下,使用以下命令: ``` scrapy genspider myspider example.com ``` 这将创建一个名为`myspider`的新Spider,并将其设置为爬取`example.com`域名下的数据。 接下来,在新创建的Spider中添加以下代码: ```python import scrapy class MySpider(scrapy.Spider): name = "myspider" start_urls = ["http://example.com/page=1"] def parse(self, response): # 解析网页内容,并提取你需要的数据 # ... # 检查是否还有下一页 next_page = response.css(".next-page-link ::attr(href)").extract_first() if next_page: yield scrapy.Request(url=next_page, callback=self.parse) ``` 在上面的代码中,`start_urls`变量包含了你要爬取的第一页的URL。在`parse()`方法中,你需要解析网页内容并提取你需要的数据。接下来,使用`response.css()`和`response.xpath()`方法找到你需要的数据。 最后,使用`response.css()`方法找到下一页的URL,并使用`scrapy.Request()`方法创建一个新的请求。将请求的URL设置为下一页的URL,并将`callback`参数设置为`self.parse`,以便在获取下一页的内容时继续调用`parse()`方法。 现在,你可以在命令行中使用以下命令运行Spider: ``` scrapy crawl myspider ``` 这将开始爬取第一页的内容,并继续爬取所有下一页的内容。在每个页面上,你可以使用`parse()`方法提取你需要的数据
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值