Scrapy Python web crawling
Light · Postcard
102 × 152 mm · PDF
Dark · Postcard
102 × 152 mm · PDF
Ink saver · Postcard
102 × 152 mm · PDF
Light · A4 landscape
297 × 210 mm · PDF
Dark · A4 landscape
297 × 210 mm · PDF
Ink saver · A4 landscape
297 × 210 mm · PDF
Light · A3 landscape
420 × 297 mm · PDF
Dark · A3 landscape
420 × 297 mm · PDF
Ink saver · A3 landscape
420 × 297 mm · PDF
Start here
scrapy startproject <name>
scrapy genspider <name> <domain>
scrapy shell "<url>"
scrapy crawl <spider>
scrapy crawl <spider> -O out.json
scrapy listscrapy fetch "<url>"
scrapy parse --spider=<name>
"<url>"
Concepts
- Spider start requests
- Downloader fetches page
- parse() callback
- Item pipeline / feed clean, store
Project setup
scrapy startproject <name> [dir]
scrapy genspider <name> <domain>
scrapy genspider -l
scrapy genspider -t crawl <name> <domain>
scrapy listRunning spiders
scrapy crawl <spider>
scrapy runspider <file.py>
scrapy crawl <spider> -a
<name>=<value>
scrapy crawl <spider> -s
<NAME>=<value>
scrapy crawl <spider> -s DOWNLOAD_DELAY=1
scrapy crawl <spider> -L INFO
scrapy crawl <spider> --nolog
scrapy crawl <spider> -s JOBDIR=<dir>
Output (feeds)
scrapy crawl <spider> -o <file>
scrapy crawl <spider> -O <file>
scrapy crawl <spider> -o
<file>:<format>
scrapy crawl <spider> -O out.jsonl
scrapy crawl <spider> -O out.csv
Shell and inspection
scrapy shell "<url>"
scrapy shell -c
"response.css('title::text').get()"
"<url>"
scrapy fetch "<url>"
scrapy fetch --headers "<url>"
scrapy view "<url>"
scrapy parse --spider=<name>
"<url>"
scrapy parse -c <callback>
"<url>"
scrapy settings --get <SETTING>
Shell objects and selectors
response.css("<sel>")
response.css("<sel>::text").getall()
response.css("<sel>::attr(href)").get()
response.xpath("//<tag>")
view(response)fetch("<url>")
inspect_response(response, self)
Spider code
yield {"<key>": <value>}
yield response.follow(<href>,
callback=self.<fn>)
response.follow_all(css="<sel>",
callback=self.<fn>)
yield scrapy.Request(<url>,
callback=self.<fn>)
cb_kwargs={"<key>": <value>}
custom_settings = {"<SETTING>":
<value>}
start_urls = ["<url>"]
AUTOTHROTTLE_ENABLED = True
Recipes
scrapy startproject shopcd shopscrapy genspider books books.toscrape.comscrapy shell "https://books.toscrape.com"# edit spiders/books.py, then:scrapy crawl books -O books.json
# quotes.pyimport scrapyclass Quotes(scrapy.Spider): name = "quotes" start_urls = ["https://quotes.toscrape.com"] def parse(self, response): for q in response.css("div.quote"): yield {"text": q.css("span.text::text").get()} yield from response.follow_all(css="li.next a", callback=self.parse)scrapy runspider quotes.py -O quotes.jsonl
scrapy crawl <spider> \ -s JOBDIR=crawls/run1 \ -s AUTOTHROTTLE_ENABLED=True \ -s DOWNLOAD_DELAY=1 \ -O out.jsonl
scrapy fetch "<url>" > page.htmlscrapy view "<url>"scrapy parse --spider=<name> -c <callback> "<url>"



