下面就来讲解一下使用Scrapy爬取网页内容的完整攻略:
确定目标网站和爬取页面
首先,我们需要确定要爬取的目标网站和具体的爬取页面。在确定目标网站时需要注意网站的robots协议,避免不必要的麻烦。在确定爬取页面时也需要注意规避反爬虫机制。
假设我们要爬取的是豆瓣读书的畅销书排行榜,页面链接为:https://book.douban.com/chart?subcat=F。
创建Scrapy项目
接下来,我们需要在命令行中创建Scrapy项目:
scrapy startproject douban_books
这样,Scrapy会为我们创建一个名为“douban_books”的目录,目录下包含了一个默认的爬虫模板,以及一些可以配置的文件。
创建爬虫
我们需要在“spiders”目录下创建一个名为“douban.py”的爬虫文件。文件内容如下:
import scrapy
class DoubanSpider(scrapy.Spider):
name = "douban"
start_urls = [
'https://book.douban.com/chart?subcat=F',
]
def parse(self, response):
for book in response.css('tbody tr'):
yield {
'name': book.css('a::text').extract_first(),
'author': book.css('p.color-gray::text').extract_first(),
'publisher': book.css('p:last-child::text').extract_first().strip(),
'score': book.css('span.rating_nums::text').extract_first(),
}
我们在其中定义了一个名为“douban”的爬虫,初始的链接为“https://book.douban.com/chart?subcat=F”,然后在“parse”函数中对页面进行解析,提取出我们需要的字段,包括书名、作者、出版社和评分等。
运行爬虫并保存数据
我们可以在命令行中进入到“douban_books”目录下,然后执行以下命令来运行爬虫:
scrapy crawl douban -o books.json
这样,爬虫就会开始运行,抓取页面并解析出我们需要的数据。最后,数据会被保存到名为“books.json”的文件中。
除了保存到JSON文件之外,我们还可以将数据保存到CSV、XML等其他格式的文件中,具体可以参考Scrapy文档中的说明。
示例说明1:使用代理IP
部分网站会根据IP地址来判断是否是爬虫,为了避免被封禁,我们可以使用代理IP来进行爬取。
import scrapy
class DoubanSpider(scrapy.Spider):
name = "douban"
start_urls = [
'https://book.douban.com/chart?subcat=F',
]
def start_requests(self):
proxy_url = 'http://ip:port' # 格式为:http://IP地址:端口号
yield scrapy.Request(url=self.start_urls[0], callback=self.parse, meta={'proxy': proxy_url})
def parse(self, response):
for book in response.css('tbody tr'):
yield {
'name': book.css('a::text').extract_first(),
'author': book.css('p.color-gray::text').extract_first(),
'publisher': book.css('p:last-child::text').extract_first().strip(),
'score': book.css('span.rating_nums::text').extract_first(),
}
在上述代码中,我们在“start_requests”函数中指定了代理IP,并将其通过meta参数传递到回调函数中。
示例说明2:使用Selenium进行动态爬取
一些网页中的内容是通过JavaScript动态加载得到的,而Scrapy只能处理静态页面,此时可以使用Selenium进行动态爬取。
首先需要安装selenium和webdriver,对应的命令如下:
pip install selenium
然后需要下载浏览器的webdriver,将webdriver与浏览器版本匹配,下载地址如下:
- Chrome webdriver: http://chromedriver.chromium.org/downloads
- Firefox webdriver: https://github.com/mozilla/geckodriver/releases
在代码中引用selenium库,修改“parse”函数,在其中使用Selenium进行页面的动态加载。
import scrapy
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
class DoubanSpider(scrapy.Spider):
name = "douban"
start_urls = [
'https://book.douban.com/chart?subcat=F',
]
def __init__(self):
chrome_options = Options()
chrome_options.add_argument('--headless')
self.driver = webdriver.Chrome(chrome_options=chrome_options)
def parse(self, response):
self.driver.get(response.url)
for book in self.driver.find_elements_by_css_selector('tbody tr'):
yield {
'name': book.find_element_by_css_selector('a').text,
'author': book.find_element_by_css_selector('p.color-gray').text,
'publisher': book.find_elements_by_css_selector('p')[-1].text.strip(),
'score': book.find_element_by_css_selector('span.rating_nums').text,
}
def closed(self, reason):
self.driver.quit()
在上述代码中,我们在“init”函数中创建了一个ChromeDriver实例,并通过chrome_options设置无头模式“--headless”,然后在“parse”函数中使用Selenium进行页面的动态加载,最后在“closed”函数中释放资源。
以上就是使用Scrapy进行网页内容爬取的完整攻略,包括创建项目、创建爬虫、运行爬虫并保存数据等步骤,同时还提供了使用代理IP和Selenium进行动态爬取的示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python下使用Scrapy爬取网页内容的实例 - Python技术站