抓取网站时陷入循环/错误的 Xpath
Stuck in a loop / bad Xpath when doing scraping of website
我正在尝试从该网站抓取数据:https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM
我为初始数据制作了以下脚本:
import scrapy
class WaiascrapSpider(scrapy.Spider):
name = 'waiascrap'
allowed_domains = ['clsaa-dc.org']
start_urls = ['https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM']
def parse(self, response):
rows = response.xpath("//tr")
for row in rows:
day = rows.xpath("(//tr/td[@class='time']/span)[1]/text()").get()
time = rows.xpath("//tr/td[@class='time']/span/time/text()").get()
yield{
'day': day,
'time': time,
}
但是我得到的数据是重复的,就像我没有导航 For 循环一样:
PS C:\Users\gasgu\PycharmProjects\ScrapingProject\projects\waia>
scrapy crawl waiascrap 2021-08-20 15:25:11 [scrapy.utils.log] INFO:
Scrapy 2.5.0 started (bot: waia) 2021-08-20 15:25:11
[scrapy.utils.log] INFO: Versions: lxml 4.6.3.0, libxml2 2.9.5,
cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted 21.7.0, Python
3.9.6 (t ags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)], pyOpenSSL 20.0.1 (OpenSSL 1.1.1k 25 Mar 2021), cryptography
3.4.7, Platform Windows-10-
10.0.19042-SP0 2021-08-20 15:25:11 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor 2021-08-20
15:25:11 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME':
'waia', 'NEWSPIDER_MODULE': 'waia.spiders', 'ROBOTSTXT_OBEY': True,
'SPIDER_MODULES': ['waia.spiders']} 2021-08-20 15:25:11
[scrapy.extensions.telnet] INFO: Telnet Password: 9299b6be5840b21c
2021-08-20 15:25:11 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
'scrapy.extensions.telnet.TelnetConsole',
'scrapy.extensions.logstats.LogStats'] 2021-08-20 15:25:11
[scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
'scrapy.downloadermiddlewares.retry.RetryMiddleware',
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
'scrapy.downloadermiddlewares.stats.DownloaderStats'] 2021-08-20
15:25:11 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
'scrapy.spidermiddlewares.referer.RefererMiddleware',
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2021-08-20 15:25:11
[scrapy.middleware] INFO: Enabled item pipelines: [] 2021-08-20
15:25:11 [scrapy.core.engine] INFO: Spider opened 2021-08-20 15:25:11
[scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min),
scraped 0 items (at 0 items/min) 2021-08-20 15:25:11
[scrapy.extensions.telnet] INFO: Telnet console listening on
127.0.0.1:6023 2021-08-20 15:25:12 [scrapy.core.engine] DEBUG: Crawled (404) <GET https://aa-dc.org/robots.txt> (referer: None) 2021-08-20
15:25:13 [scrapy.core.engine] DEBUG: Crawled (200) <GET
https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> (referer: None)
2021-08-20 15:25:16 [scrapy.core.scraper] DEBUG: Scraped from <200
https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day':
'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:19 [scrapy.core.scraper]
DEBUG: Scraped from <200
https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day':
'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:22 [scrapy.core.scraper]
DEBUG: Scraped from <200
https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day':
'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:26 [scrapy.core.scraper]
DEBUG: Scraped from <200
https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day':
'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:29 [scrapy.core.scraper]
DEBUG: Scraped from <200
https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day':
'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:32 [scrapy.core.scraper]
DEBUG: Scraped from <200
https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day':
'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:35 [scrapy.core.scraper]
DEBUG: Scraped from <200
https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day':
'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:39 [scrapy.core.scraper]
DEBUG: Scraped from <200
https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day':
'Sunday', 'time': '6:45 am'}
编辑:
现在可以正常使用了,其中包含@Prophet 标记的错误以及我的 Xpath 问题。
我将我的代码放在下面:
import scrapy
class WaiascrapSpider(scrapy.Spider):
name = 'waiascrap'
allowed_domains = ['clsaa-dc.org']
start_urls = ['https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM']
def parse(self, response):
rows = response.xpath("//tr")
for row in rows:
day = row.xpath(".//td[@class='time']/span/text()").get()
time = row.xpath(".//td[@class='time']/span/time/text()").get()
yield {
'day': day,
'time': time,
}
对于元素内的 select 元素,您必须在 XPath 表达式前面放置一个点 .
,表示“从这里开始”。
否则它每次都会给你带来整个页面上第一个(//tr/td[@class='time']/span)[1]/text()
的匹配,如你所见。
此外,由于您是针对每个 row
进行迭代,因此它应该是 row.xpath...
,而不是 rows.xpath
,因为 rows
是一个元素列表,而每个 row
是一个元素。
此外,要根据 XPath 定位器在 Web 元素上应用搜索,您应该使用 find_element_by_xpath
方法,而不是 xpath
.
def parse(self, response):
rows = response.xpath("//tr")
for row in rows:
day = row.find_element_by_xpath(".(//tr/td[@class='time']/span)[1]/text()").get()
time = row.find_element_by_xpath("//.tr/td[@class='time']/span/time/text()").get()
yield{
'day': day,
'time': time,
}
我正在尝试从该网站抓取数据:https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM
我为初始数据制作了以下脚本:
import scrapy
class WaiascrapSpider(scrapy.Spider):
name = 'waiascrap'
allowed_domains = ['clsaa-dc.org']
start_urls = ['https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM']
def parse(self, response):
rows = response.xpath("//tr")
for row in rows:
day = rows.xpath("(//tr/td[@class='time']/span)[1]/text()").get()
time = rows.xpath("//tr/td[@class='time']/span/time/text()").get()
yield{
'day': day,
'time': time,
}
但是我得到的数据是重复的,就像我没有导航 For 循环一样:
PS C:\Users\gasgu\PycharmProjects\ScrapingProject\projects\waia> scrapy crawl waiascrap 2021-08-20 15:25:11 [scrapy.utils.log] INFO: Scrapy 2.5.0 started (bot: waia) 2021-08-20 15:25:11 [scrapy.utils.log] INFO: Versions: lxml 4.6.3.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted 21.7.0, Python 3.9.6 (t ags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)], pyOpenSSL 20.0.1 (OpenSSL 1.1.1k 25 Mar 2021), cryptography 3.4.7, Platform Windows-10- 10.0.19042-SP0 2021-08-20 15:25:11 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor 2021-08-20 15:25:11 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'waia', 'NEWSPIDER_MODULE': 'waia.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['waia.spiders']} 2021-08-20 15:25:11 [scrapy.extensions.telnet] INFO: Telnet Password: 9299b6be5840b21c 2021-08-20 15:25:11 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.logstats.LogStats'] 2021-08-20 15:25:11 [scrapy.middleware] INFO: Enabled downloader middlewares: ['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 'scrapy.downloadermiddlewares.retry.RetryMiddleware', 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 'scrapy.downloadermiddlewares.stats.DownloaderStats'] 2021-08-20 15:25:11 [scrapy.middleware] INFO: Enabled spider middlewares: ['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2021-08-20 15:25:11 [scrapy.middleware] INFO: Enabled item pipelines: [] 2021-08-20 15:25:11 [scrapy.core.engine] INFO: Spider opened 2021-08-20 15:25:11 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2021-08-20 15:25:11 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023 2021-08-20 15:25:12 [scrapy.core.engine] DEBUG: Crawled (404) <GET https://aa-dc.org/robots.txt> (referer: None) 2021-08-20 15:25:13 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> (referer: None) 2021-08-20 15:25:16 [scrapy.core.scraper] DEBUG: Scraped from <200 https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day': 'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:19 [scrapy.core.scraper] DEBUG: Scraped from <200 https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day': 'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:22 [scrapy.core.scraper] DEBUG: Scraped from <200 https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day': 'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:26 [scrapy.core.scraper] DEBUG: Scraped from <200 https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day': 'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:29 [scrapy.core.scraper] DEBUG: Scraped from <200 https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day': 'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day': 'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:35 [scrapy.core.scraper] DEBUG: Scraped from <200 https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day': 'Sunday', 'time': '6:45 am'} 2021-08-20 15:25:39 [scrapy.core.scraper] DEBUG: Scraped from <200 https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM> {'day': 'Sunday', 'time': '6:45 am'}
编辑:
现在可以正常使用了,其中包含@Prophet 标记的错误以及我的 Xpath 问题。
我将我的代码放在下面:
import scrapy
class WaiascrapSpider(scrapy.Spider):
name = 'waiascrap'
allowed_domains = ['clsaa-dc.org']
start_urls = ['https://aa-dc.org/meetings?tsml-day=any&tsml-type=IPM']
def parse(self, response):
rows = response.xpath("//tr")
for row in rows:
day = row.xpath(".//td[@class='time']/span/text()").get()
time = row.xpath(".//td[@class='time']/span/time/text()").get()
yield {
'day': day,
'time': time,
}
对于元素内的 select 元素,您必须在 XPath 表达式前面放置一个点 .
,表示“从这里开始”。
否则它每次都会给你带来整个页面上第一个(//tr/td[@class='time']/span)[1]/text()
的匹配,如你所见。
此外,由于您是针对每个 row
进行迭代,因此它应该是 row.xpath...
,而不是 rows.xpath
,因为 rows
是一个元素列表,而每个 row
是一个元素。
此外,要根据 XPath 定位器在 Web 元素上应用搜索,您应该使用 find_element_by_xpath
方法,而不是 xpath
.
def parse(self, response):
rows = response.xpath("//tr")
for row in rows:
day = row.find_element_by_xpath(".(//tr/td[@class='time']/span)[1]/text()").get()
time = row.find_element_by_xpath("//.tr/td[@class='time']/span/time/text()").get()
yield{
'day': day,
'time': time,
}