Python 在scrapy中有类似spliter的东西吗?
我在刮,我想刮所有的页面,我对刮有一个基本的想法,下面是我使用的代码:Python 在scrapy中有类似spliter的东西吗?,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我在刮,我想刮所有的页面,我对刮有一个基本的想法,下面是我使用的代码: import scrapy import json class PatelcospiderSpider(scrapy.Spider): name = 'patelcospider' start_urls = ['https://www.patelco.org/search-results''#stq=&stp=1'] def parse(self, response): co
import scrapy
import json
class PatelcospiderSpider(scrapy.Spider):
name = 'patelcospider'
start_urls = ['https://www.patelco.org/search-results''#stq=&stp=1']
def parse(self, response):
columns = {
"question": [],
"answer": []
}
QUESTION_ANSWER_SELECTOR = ".st-ui-result"
QUESTION_SELECTOR = ".st-ui-type-heading ::text"
ANSWER_SELECTOR = ".st-ui-type-detail ::text"
questions_answers = response.css(QUESTION_ANSWER_SELECTOR)
for question_answer in questions_answers:
question = question_answer.css(QUESTION_SELECTOR).getall()
question = " ".join(question).strip()
answer = question_answer.css(ANSWER_SELECTOR).getall()
answer = " ".join(answer).strip()
columns["question"].append(question)
columns["answer"].append(answer)
columns["link"].append(response.url)
return columns
执行时不返回任何值。以下是相关的输出:
2020-08-28 20:39:48[刮屑.堆芯.发动机]信息:蜘蛛网已打开
2020-08-28 20:39:48[scrapy.extensions.logstats]信息:已爬网0页
(以0页/分钟的速度),刮取0个项目(以0个项目/分钟的速度)
2020-08-28 20:39:48[scrapy.extensions.telnet]信息:telnet控制台
收听127.0.0.1:6023
2020-08-28 20:39:55[scrapy.core.engine]调试:爬网(200)这是因为页面是由javascript加载的。您可以在chrome开发工具中自己检查这一点 检查页面-->面板右侧的三个点-->更多工具-->设置-->调试器-->禁用javascript 有两种方法可以用来删除动态内容。动态内容是指javascript使用HTTP请求获取数据并在网页上显示。许多现代网站以这种方式显示信息。这在刮削时是一个挑战
import requests
data = {
'q': '',
'page': '1'
}
response = requests.post('https://search-api.swiftype.com/api/v1/public/installs/Ty14DuZryzPDG_wzbyzh/search.json', data=data)
response.json()
现在,如果你复制了请求,你也会得到标题,这是值得玩弄的请求。有些请求只需要一个简单的HTTP get请求,没有任何头、数据、参数和cookie。其他人将需要更多。这里我们需要做的就是在数据参数中指定页码
输出
这里有很多信息,但是我们可以用它来做一个简单的请求
Scrapy的代码示例
请注意,meta
参数是一种确保请求也包含我们希望随HTTP请求发送的数据的方法。没有它,您将无法获得所需的正确JSON对象
这里response.json()
将json对象转换为python字典。在使用scrapy编码之前,我倾向于使用requests包来考虑我想要显示的数据,因为在显示的字典中有嵌套
举个例子
response.json()['records']['page'][0]['title']
对应于输出
'Serving San Francisco Bay Area, Santa Rosa & Sacramento - Patelco Credit Union'
当您将JSON对象转换为字典时,通常会有很多嵌套,这就是为什么我首先使用requests包来解决它。页面嵌套在response.json()['records']['page']
然后,您需要考虑使用字典,或者最好使用条目来存储所需的数据。如果你不确定的话,请查阅相关的文档
您还可以更改数据参数,以请求更多页面以获取更多数据,但我会先考虑如何自己执行此操作。如果你有困难,我很乐意帮助你。非常感谢你,它从字面上解释了我的想法。我确实在网络选项卡中找到了search.json,但无法将其拉出来。我对API有一个模糊的概念,在过去的一个月里我真的很挣扎。关于提取更多的页面,我在第号页面上循环了一圈,它开始工作了。再次感谢你。
response.json()['records']['page'][0]['title']
'Serving San Francisco Bay Area, Santa Rosa & Sacramento - Patelco Credit Union'