我对 Python 非常陌生,我正在尝试将 Scrapy 与 Django 集成。
这是我想要实现的:
实现这一目标的最佳方法是什么?我玩过 Django Dynamic Scraper,但我认为我最好为此保持对 Scrapy 的控制。
我有一个由scrapy生成的以下格式的json文件:
[
{
"area_of_interest": [
"Pharmaceutical"
],
"department": [
"RETAIL PHARMACY: APOTHECARY"
],
"duties": [
"EDUCATION:"
],
"job_function": [
"Texas Health Presbyterian Hospital Dallas is seeking a Registered Pharmacy Technician to work PRN (as needed) hours in the Retail Pharmacy. Primary hours will be weekday shifts between 9a-5p. There will be occasional 12 hr shifts. The following is required:"
],
"job_id": [
" 56345"
],
"job_type": [
"PRN"
],
"location": [
"Dallas, TX, US"
],
"location_type": [
" Texas Health …Run Code Online (Sandbox Code Playgroud) 我想每 120 秒运行一些 python 代码。
我试过这个:
class AppServerSvc :
def f(self):
# call f() again in 120 seconds
spider = FantasySerieaSpider()
settings = get_project_settings()
crawler = Crawler(settings)
crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start()
reactor.run() # the script will block here until the spider_closed signal was sent
threading.Timer(120, f).start()
if __name__ == '__main__':
AppServerSvc().f();
Run Code Online (Sandbox Code Playgroud)
我得到了threading is not defined错误
这是我的进口:
import pythoncom
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
from twisted.internet import reactor
from scrapy.crawler import Crawler …Run Code Online (Sandbox Code Playgroud) 当您从 Python Shell 或命令行运行 Scrapy 程序时,您会在屏幕上打印如下项目:
c:\Python27\webscraper2\webscraper2>scrapy crawl mrcrawl2
2014-08-28 00:12:21+0100 [scrapy] INFO: Scrapy 0.24.4 started (bot: webscraper2)
2014-08-28 00:12:21+0100 [scrapy] INFO: Optional features available: ssl, http11
2014-08-28 00:12:21+0100 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'webscraper2.spiders', 'SPIDER_MODULES': ['webscraper2.spiders'], 'BOT_NAME': 'webscraper2'}
2014-08-28 00:12:21+0100 [scrapy] INFO: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2014-08-28 00:12:21+0100 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddle
ware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2014-08-28 00:12:21+0100 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, …Run Code Online (Sandbox Code Playgroud) 因此,我对使用 XPath 还比较陌生,而且我在磨练我需要用于我的特定应用程序的确切语法方面遇到了一些困难。我构建的刮板工作得非常好(当我使用不太复杂的路径时,它可以工作)。一旦我尝试更具体地了解我的路径,它就不会返回正确的值。
我试图操纵的文档结构的简化模型是
<table class="rightLinks">
<tbody>
<tr>
<td>
<a href="http://wwww.example.com">Text That I want to Grab</a>
</td>
<td>Some</td>
<td>Text</td>
</tr>
<tr>
<td>
<a href="http://wwww.example2.com">Text That I want to Grab</a>
</td>
<td>Some</td>
<td>Text</td>
</tr>
<tr>
<td>
<a href="http://wwww.example3.com">Text That I want to Grab</a>
</td>
<td>Some</td>
<td>Text</td>
</tr>
<tr>
<td>
<a href="http://wwww.example4.com">Text That I want to Grab</a>
</td>
<td>Some</td>
<td>Text</td>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
基本上,我想获取 href 值和带有链接的文本。
这是我的刮板关于这个以及我迄今为止尝试过的部分:
import scrapy
from scrapy.selector import HtmlXPathSelector
from scrapy.http import HtmlResponse
def parse(self, response):
for sel …Run Code Online (Sandbox Code Playgroud) <li class="a">category1</li>
<li>subcatergory1</li>
<li>subcatergory2</li>
<li class="a">category2</li>
<li>subcatergory1</li>
<li>subcatergory2</li>
Run Code Online (Sandbox Code Playgroud)
我正在遍历ul包含 2 种的li,一种有a类,一种没有。我想知道是否有一种现有的方法来检查a给定的类是否存在li,而不是提取类值并手动比较它。
for li in ul
if (li has class:a)
....
Run Code Online (Sandbox Code Playgroud)
任何想法将不胜感激。
在 Scrapy 示例中,我发现了这一行
next_page = response.css('div.prev-post > a ::attr(href)').extract_first()Run Code Online (Sandbox Code Playgroud)
现在我不想选择第一个所以我将提取第一个链接,其中有一个 'rel="next"' 。
我试试
next_page = response.css('div.prev-post > a[@rel="next"] ::attr(href)').extract_first()Run Code Online (Sandbox Code Playgroud)
但它不起作用。
我怎么能这样做?
谢谢
乔尼
无论出于何种原因,所有项目都作为元组返回。不知道我错过了什么。在所有其他蜘蛛和项目中,它只是一个列表(当我使用提取()时)。
{'acne': (None,),
'function': ([u'\u2027Preservative'],),
'function0': u'\u2027Preservative',
'irritant': (None,),
'name': (u'Potassium Sorbate',),
'safety': (u'3',),
'url': 'http://cosdna.com/eng/383bb7435.html'}
Run Code Online (Sandbox Code Playgroud)
这是我的蜘蛛代码。
def parse(self, response):
inspect_response(response, self)
a = response.xpath('//table//tr')
for i in a:
item = CosdnaExtItem()
item['name'] = i.xpath('./td/a/text()').extract_first(),
item['url'] = i.xpath('./td/a/@href').extract_first(),
item['function'] = i.xpath('.//td[2]/span//text()').extract(),
item['acne'] = i.xpath('.//td[3]/span//text()').extract_first(),
item['irritant'] = i.xpath('.//td[4]/span//text()').extract_first(),
item['safety'] = i.xpath('.//td[5]/div//text()').extract_first(),
yield item
Run Code Online (Sandbox Code Playgroud) 我正在使用scrapy 1.5并且我正在以编程方式尝试通过python脚本运行scrapy爬虫程序.作为其中的一部分,我需要导入爬虫设置并覆盖其一些参数.
我发现这个import语句可以满足我的需求:
from scrapy.conf import settings
Run Code Online (Sandbox Code Playgroud)
问题是,这有效,但也会产生以下弃用警告:
ScrapyDeprecationWarning: Module `scrapy.conf` is deprecated, use `crawler.settings` attribute instead
Run Code Online (Sandbox Code Playgroud)
所以我猜这是一些旧版本.警告之后,我试图访问scrapy.crawler.settings,但这不存在(或者,经过一些搜索我找不到它).
我该如何解决此警告?
我在从Wikipedia抓取一些字符串数据时遇到问题。这是我的代码:
import scrapy
import json
class communes_spider(scrapy.Spider):
name = "city"
start_urls = ['https://fr.wikipedia.org/wiki/Liste_des_communes_de_Belgique_par_population']
def parse(self, response):
for city in response.css('table.wikitable td a::text').getall():
if city == '2':
pass
elif city == '3':
pass
else:
yield {
'cities': city + ', BE'
}
Run Code Online (Sandbox Code Playgroud)
问题在于字符串是法语,有些城市包含“è”或“é”。当我将它们导出到json文件时,像“ Li \ u00e8ge”这样的单词被导出为“Liège”。如何将那些弦变成法语字母?
scrapy ×10
python ×7
django ×2
json ×1
postgresql ×1
python-2.7 ×1
python-3.x ×1
scraper ×1
web-crawler ×1
web-scraping ×1
xpath ×1