搜索指定网站内容(Python脚本使用模块脚本的内容和对应的URL )
优采云 发布时间: 2022-01-12 06:19搜索指定网站内容(Python脚本使用模块脚本的内容和对应的URL
)
本博客内容仅供Python学习交流。
如上图,在豆瓣我要爬的群里,所有的群标题和对应的与意大利留学内容相关的网址。这里我使用 Python 脚本以两种方式爬取我需要的内容。两个脚本如下:
使用 selenium 模块进行爬网
# -*- coding: utf-8 -*-
# python3.6
import csv
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class DouBan:
def __init__(self, search_field):
self.search_filed = search_field
self.url = 'https://www.douban.com/search?cat=1019&q={}'.format(self.search_filed)
self.result_data = {}
def get_data(self):
driver = webdriver.Chrome()
driver.get(self.url)
wait = WebDriverWait(driver, timeout=2, poll_frequency=0.5)
# 如果不使用向url添加搜索字段的方式,也可以使用以下两行注释代码的这种方式,让selenium自动输入内容进行搜索
# driver.find_element_by_xpath("//input[@placeholder='搜索你感兴趣的内容和人']").send_keys('意大利留学'.decode('utf-8'))
# driver.find_element_by_xpath("//input[@placeholder='搜索你感兴趣的内容和人']").send_keys(Keys.RETURN)
# 通过selenium模拟浏览器向下不断翻页并自动点击‘显示更多’按钮,让网页加载显示搜索到的全部网页数据
while True:
try:
time.sleep(1)
wait.until_not(EC.presence_of_element_located((By.NAME, "style")))
driver.find_element_by_link_text("显示更多").click()
except:
break
# 将网页全部加载的数据使用bs4模块解析到需要的数据并添加到字典中
response = driver.page_source
soup = BeautifulSoup(response, "html.parser")
result = soup.find_all('div', {'class': 'result'})
for line in result:
title1 = line.div.a['title']
title_url = line.div.a['href']
self.result_data[title1] = title_url
def write_csv(self):
if self.result_data:
line_info = [[i, j] for i, j in self.result_data.items()]
with open('result.csv', 'w', newline='', encoding='utf-8-sig') as csvfile:
writer = csv.writer(csvfile)
writer.writerows(line_info)
else:
print('需要写入的数据为空')
if __name__ == '__main__':
crawl_db = DouBan('意大利留学')
crawl_db.get_data()
crawl_db.write_csv()
脚本说明:
由于豆瓣网站使用Ajax技术来展示网页内容,通过使用selenium模块模拟鼠标连续向下滑动页面,并自动点击“显示更多”,始终加载所有搜索到的内容网页内容如下图所示。
判断何时加载完所有数据,主要用“显示更多”的代码来判断:
“显示更多”代码:
显示更多
加载所有数据后,“显示更多”代码:
显示更多
使用请求模块进行抓取
脚本说明:
使用Chrome浏览器分析请求url参数:
从上面的截图可以看到url的请求参数。经过多次请求,发现有3个可变参数,分别是q、start、cat。其中q为搜索字段值,这里是我要搜索的“留学意大利”,开始显示内容的偏移量一次叠加20,默认从0开始,cat为搜索类别,这里是团体。使用urlencode()方法将这三个参数转换为URL的get请求参数,然后使用requests模块的get方法请求URL的内容。
最后一次爬取的内容被写入 csv 文件。部分结果如下所示: