yield items AND requestsparse returns data (dicts/Items) and follow-up Requests
::text and ::attr(href)Scrapy's CSS pseudo-elements; .get()/.getall()
get() is None-safeget(default="") before converting types
response.follow for paginationresolves relative URLs; follow_all for many
cb_kwargs to pass datacleaner than meta for callback arguments
scrapy shell "url"perfect selectors interactively before coding
check for a hidden JSON APIresponse.json() beats parsing JS-rendered HTML
AutoThrottle + robots + delaypoliteness = not getting banned
pipelines process every itemclean/validate/store; DropItem to discard