努力使用Scrapy抓取网站

hgtggwj0  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(186)

我最近开始了我的第一个Python项目。我对火车很感兴趣,我在我国家的铁路公司的网站上没有找到任何CSV数据,所以我决定用Scrapy来做网页抓取。然而,当我在终端中使用fetch命令来测试响应时,我总是遇到DEBUG:Crawled(403).当我尝试获取第二个链接时,终端冻结这些是我想要抓取以获取项目数据的网站:
https://www.intercity.pl/pl/site/dla-pasazera/informacje/frekwencja.html?location=&date=2022-10-25&category%5Beic_premium%5D=eip&category%5Beic%5D=eic&category%5Bic%5D=ic&category%5Btlk%5D=tlk
https://rozklad-pkp.pl/pl/sq?maxJourneys=40&start=yes&dirInput=&GUIREQProduct_0=on&GUIREQProduct_1=on&GUIREQProduct_2=on&advancedProductMode=&boardType=arr&input=&input=5100028&date=25.10.22&dateStart=25.10.22&REQ0JourneyDate=25.10.22&time=17%3A59
在看了几篇关于这个问题的文章之后,我在我的未来蜘蛛的设置中做了一些改变来克服这些错误,比如禁用cookie,使用scrapy-fake-useragent,以及改变下载延迟。我还试图只将USER_AGENT变量设置为某个随机的useragent,而不引用scrapy-fake-useragent。不幸的是,这些都不起作用。

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
    'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
    'scrapy_fake_useragent.middleware.RetryUserAgentMiddleware': 401,
}

FAKEUSERAGENT_PROVIDERS = [
    'scrapy_fake_useragent.providers.FakeUserAgentProvider',  # this is the first provider we'll try
    'scrapy_fake_useragent.providers.FakerProvider',  # if FakeUserAgentProvider fails, we'll use faker to generate a user-agent string for us
    'scrapy_fake_useragent.providers.FixedUserAgentProvider',  # fall back to USER_AGENT value
]
USER_AGENT = 'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148'

我还没有写任何代码,因为我试着先检查终端的响应。有什么我可以做的让我的项目继续吗?

9rygscc1

9rygscc11#

你的第一个链接运行良好,我能够成功地从表格中提取所有的信息,在我下面的例子中使用蜘蛛,并且不需要额外的中间件来访问它。你的第二个链接是一个死胡同,虽然在scrappy和试图访问它使用浏览器。你可能需要再次检查你的URL是准确的。

import scrapy

class Train(scrapy.Spider):
    name = "train"

    def start_requests(self):
        yield scrapy.Request("https://www.intercity.pl/pl/site/dla-pasazera/informacje/frekwencja.html?location=&date=2022-10-28&category%5Beic_premium%5D=eip&category%5Beic%5D=eic&category%5Bic%5D=ic&category%5Btlk%5D=tlk")

    def parse(self, response):
        for row in response.xpath("//table//tr"):
            yield {
                "train": row.xpath("./td[@headers='freq-table-header-train']/text()").get(),
                "number": row.xpath("./td[@headers='freq-table-header-number']/text()").get(),
                "category": row.xpath("./td[@headers='freq-table-header-category']/text()").get(),
                "name": row.xpath("./td[@headers='freq-table-header-name']/text()").get(),
                "from": row.xpath("./td[@headers='freq-table-header-connection_from']/text()").get(),
                "to": row.xpath("./td[@header='freq-table-header-connection_to']/text()").get(),
                "popularity": row.xpath("./td[@headers='freq-table-header-connection_popularity']/text()").get()
            }

相关问题