1.下載包
pip install scrapy
2.在使用路徑終端上創建項目指令: scrapy startproject 項目名
爬蟲文件名和爬蟲名稱不能相同,spiders目錄內不能存在相同的爬蟲名稱的項目文件
scrapy startproject maoyan
cd maoyan
scrapy genspider maoyan https://www.maoyan.com/
創建后目錄大致頁如下
|-ProjectName #項目文件夾
|-ProjectName #項目目錄
|-items.py #定義數據結構
|-middlewares.py #中間件
|-pipelines.py #數據處理
|-settings.py #全局配置
|-spiders
|-__init__.py #爬蟲文件
|-maoyan.py
|-scrapy.cfg #項目基本配置文件
3.settings設置如下:
4.在items.py上編寫需要抓取的內容
5.創建一個maoyan_spider.py文件
6.在 maoyan_spider.py上編寫
將復制出來的一大行的(包括電影名人名時間的)xpath先寫起來,再復制下一行的xpath,再寫起來,對比就可以發現規律了,通過循環每一大行,再細定位就可以了,細定位同樣的單獨復制兩個電影名就可以發現其中的區別了
這是一大行的定位: //*[@id="app"]/div/div/div[1]/dl/dd[1]/div/div/div[1],//*[@id="app"]/div/div/div[1]/dl/dd[2]/div/div/div[1]可以看出dd[]是變量,所以在它前面的都是固定的,用//替換dd[],就可以得到一整頁的行了,move_list=//*[@id='app']/div/div/div[1]/dl//div/div/div[1]
電影名為//*[@id="app"]/div/div/div[1]/dl/dd[3]/div/div/div[1]/p[1]/a ,時間為://*[@id="app"]/div/div/div[1]/dl/dd[3]/div/div/div[1]/p[3],可以看出在for循環每一行里面共用的開頭那部分就是剛剛定位的一大行move_list的可以用" . "表示,".//p[1]/a",".//p[3]"
當然你也可以直接看網頁中的標簽自己寫出來,方法不唯一
aaa=d.xpath(".//p[1]/a").extract_first() # 這是輸出的第一個數據
輸出之后接下來就是字符串的處理了。
這里沒有下一頁的功能,這里沒有下一頁的功能,大部分網頁翻頁功能一般方法:看網址是否有變量比如10,20,或者點擊下一頁按鈕,同樣也可以看request請求的變量。
7.手動創建一個main.py,用來運行的,也可以用指令
8.運行main.py
9.存儲方式:json,csv,mysql
1)保存到json——注意路徑
scrapy crawl maoyan_spider -o test.json
2)保存到csv——注意路徑
scrapy crawl maoyan_spider -o test.csv
3)保存到數據庫mysql
數據庫自己先建好表和字段,這里是直接插入數據的
#settings.py # mongo_host='192.168.x.xxx' # mongo_post=27017 # mongo_db_name='maoyan' # mongo_db_collection='maoyan_movie' MYSQL_HOST = 'localhost' MYSQL_DBNAME = 'maoyan_sql' MYSQL_USER = 'root' MYSQL_PASSWD = '1234'
#pipelines.py # mongo_host='192.168.x.xxx' # mongo_post=27017 # mongo_db_name='maoyan' # mongo_db_collection='maoyan_movie' MYSQL_HOST = 'localhost' MYSQL_DBNAME = 'maoyan_sql' MYSQL_USER = 'root' MYSQL_PASSWD = '1234'#pipelines.py from itemadapter import ItemAdapter import pymysql from sqlalchemy import * from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base from datetime import datetime #連接數據庫 from maoyan import settings def dbHandle(): conn = pymysql.connect( host = "localhost", user = "root", passwd = "1234", charset = "utf8mp4", use_unicode = False ) return conn class MaoyanPipeline: def __init__(self): # 連接數據庫 self.connect = pymysql.connect( host=settings.MYSQL_HOST, db=settings.MYSQL_DBNAME, user=settings.MYSQL_USER, passwd=settings.MYSQL_PASSWD, charset='utf8', use_unicode=True) # 通過cursor執行增刪查改 self.cursor = self.connect.cursor() def process_item(self, item, spider): try: # 插入數據 self.cursor.execute( """insert into move(move_name,peaple_name,move_time) value (%s, %s, %s)""", (item['move_name'], item['peaple_name'], item['move_time'])) # 提交sql語句 self.connect.commit() except BaseException as e: # 出現錯誤時打印錯誤日志 print("error:------------", e, "-----------------") return item #dbmongo部分參考 # def __init__(self): # host=mongo_host # post=mongo_post # dbname=mongo_db_name # sheetname=mongo_db_collection # client=pymongo.MongoClient(host=host,post=post) # mydb=client[dbname] # self.post=mydb[sheetname]#讀寫操作 # def process_item(self, item, spider): # data=dict(item)#先轉字典,再數據插入 # self.post.insert(data) # return item # # class HellospiderPipeline(object): # def process_item(self, item, spider): # dbObject = dbHandle() # cursor = dbObject.cursor() # cursor.execute("USE maoyan_sql") # #插入數據庫 # sql = "INSERT INTO move(move_name,peaple_name,move_time) VALUES(%s,%s,%s)" # try: # cursor.execute(sql, # ( item['move_name'], item['peaple_name'], item['move_time'])) # cursor.connection.commit() # except BaseException as e: # print("錯誤在這里>>>>>>>>>>>>>", e, "<<<<<<<<<<<<<") # dbObject.rollback() # return item
數據庫中查看如下:
結尾:#以下僅供參考: