python 爬虫进阶教学selenium保存到CSV

 

1.首先你要下载selenium的驱动,具体驱动可以到我主页找资源,各个版本我都有各个操作系统。

import requests,bs4,re,selenium.webdriver,time,csv,threading,os

CHROME_DRIVER ="G:\Download\chromedriver.exe"
BASE_URL = "https://movie.douban.com"
CHART_URL = BASE_URL+"/chart"
driver =selenium.webdriver.Chrome(executable_path=CHROME_DRIVER)
SAVE_DIR = "G:\爬虫文件保存处"
IMAGE_PATH=SAVE_DIR+"\images"
HEADERS=["type","rank","name","rating","comment","img","crew","url"]

2.首先确定好你要爬取的路径的URL 已经你要保存CSV 和图片的路径,以及你需要保存CSV的columns
driver =selenium.webdriver.Chrome(executable_path=CHROME_DRIVER)通过这句话加载驱动。
定义你要爬取的电影为类,给他赋有性质。

class Movie:
    def __init__(self,type):
        self.img= None
        self.name=None
        self.type=type
        self.rank=None
        self.crew=None
        self.rating=None
        self.comment=None
        self.url =None

    def get(self):


        return [self.type,self.rank,self.name,self.rating,self.comment,self.img,self.crew,self.url]

3.定义性质,初值除了type 全部设置为None 我们就是通过类型去爬取其他数据,所以需要传参传入具体的类型type 。写一个get方法 返回所有你爬取的数据。

定义主函数写出具体的type值:

def main():
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"}
    response =requests.get(CHART_URL,headers=headers)

    soup = bs4.BeautifulSoup(response.content.decode("utf-8"),"lxml")

    typrank_list = soup.find_all("a",href=re.compile("^/typerank"))

    for type_item in typrank_list:
        res = re.search(r'[^\x00-\xff]+[^\x00-\xff]', str(type_item))
        type =res.group()
        download_type(type,type_item["href"])

4.typrank_list 是返回爬取链接的href的集合,从条数据就能找到对应的URL 和 具体的URL 的type

我们通过re.search 匹配到具体的类型。type

python爬取数据保存到csv都是逗号 爬取的数据保存到csv_selenium


5.dowload_type是下面写的函数 通过循环爬取不同类型的电影。

def download_type(type,url):
    driver.get(url=BASE_URL+url)
    save_path = SAVE_DIR+os.sep+type+".csv"

    for item in range(5):
        target = driver.find_element_by_id("footer")
        driver.execute_script("arguments[0].scrollIntoView();",target)
        time.sleep(1)
    time.sleep(2)
    cout = 0
    #####3通过上面定义的driver 控制网页下滑,因为这个网页为了防止反扒设置了用户行为再动态加载数据,  我们通过driver模拟用户行为来不断加载界面。time.sleep(1)是爬取中 
    ##我们设置间歇,以防止爬取过快,网速更不上,没有爬出去到具体界面
    try:
        with open(file=save_path,mode="w",newline="",encoding="utf-8") as file:
            csv_file =csv.writer(file)
            csv_file.writerow(HEADERS)
            ##这是加载入csv的模块,先写好头标题columns
            for content in  driver.find_elements_by_xpath("//div[@class='movie-content']"):
            ###通过先找到具体大模块的内容来爬取具体小部分的内容
                movie=Movie(type)
                movie.url=content.find_element_by_tag_name("a").get_property("href")
                image_url=content.find_element_by_class_name("movie-img").get_property("src")
                ####返回超链接对应网址的方法

                if image_url:
                    movie.img = image_url[image_url.rfind("/") + 1:]
                    threading.Thread(target=dowload_movie_image, args=(image_url, movie.img)).start()


                else:
                    movie.img="没有图片"
                ####这个模块就是如果存在电影图片的链接那么久加载新的函数来下载图片。具体函数下面会定义。

                movie.name=content.find_element_by_class_name("movie-name-text").text
                movie.rank=int(content.find_element_by_class_name("rank-num").text)
                try:

                    movie.crew = content.find_element_by_class_name("movie-crew").text.split
                except:
                    movie.crew = "没有参演人员"
                movie.rating=float(content.find_element_by_class_name("rating_num").text)
                movie.comment = int(re.sub("\D", "", content.find_element_by_class_name("comment-num").text))
 ##爬取到每一个页面的信息。
                csv_file.writerow(movie.get())
                cout+=1
           ##将数据写入CSV
                if cout>=50:
                    raise Exception("爬累了,休息了!")
                    ##每个爬取前五十个 然后抛出异常,直接结束pass
    except Exception:
        pass

6.定义下载图片函数

def dowload_movie_image(url,image_name):
    image_path = IMAGE_PATH + os.sep + image_name
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"}
    response =requests.get(url,headers=headers)
    with open(file=image_path,mode="bw")as file:
        file.write(response.content)

7.主函数运行完成编译:

if __name__ == "__main__":
    main()