谈谈初学爬虫时候踩得坑

谈谈初学python时候费劲巴拉踩得坑(记录,防止代码丢失又重头再来)

  • 数据插入数据库操作(去重)

1,连接数据库

db = pymysql.connect("141.48.149.241","root","ettewewt","ku")
cursor = db.cursor()

上面这段话执行完成后会自动连接并且创建数据库"ku",

2,建数据库表

T_Name = "tb_name"
try:
    cursor.execute("CREATE TABLE IF NOT EXISTS %s (ID VARCHAR(50) PRIMARY KEY,TITLE VARCHAR(255) NOT NULL,ABSTRACT VARCHAR(255),TIME VARCHAR(50),VIDEOURL TEXT(0), GETDATE VARCHAR(50))CHARSET UTF8 COLLATE UTF8_GENERAL_CI" %T_Name)
    print("成功创建数据库")
except:
    print("准备开始添加数据")

上面可能不需要用try-except包住创建表语句,因为我创建表语句加了IF NOT EXISTS,不存在就创建 名为T_name的表

3,判断数据是否存在然后插入数据

sql = "SELECT * FROM %s "%T_Name + "WHERE ID = '%s'"%id
cursor.execute(sql)
resulut = cursor.fetchall()
if len(resulut) == 1:
    print(id+"存在")
else:
    try:
        insert= ("INSERT INTO %s"%T_Name+"(ID,TITLE,ABSTRACT,TIME,VIDEOURL,GETDATE)" "VALUES(%s,%s,%s,%s,%s,%s)")	
        data = (id,title,abstract,time,videoUrl,getDate)
        cursor.execute(insert,data)
        db.commit()
        print("ok!")
    except:
        print(id+"数据插入失败")

首先写了一个查询语句, 查询一开始创建表的表主键中是否存在我设置的主键,如果数据库存在这条数据,那么查询结果result的长度就是1,所以对这个len进行判断,当len!=1时候执行插入语句,因为我的插入语句都是变量,与%s一一对应匹配

  • 发送post请求获取json数据并且处理

 有一些网页使用ajax记载数据或者表单,此时需要F12在XHR里面找到真正进行数据传输的的方法,然后根据这个方法里面的header,formdata进行数据请求

#=====================定义请求头,请求表单数据以及url  Start=====================
headers={
'Host': '142.50.1.60',
'Referer':'http://142.50.1.60/home/vod.action',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': 'JSESSIONID=6ABAD91E4F0C5C3C86A883731BDA4775'
}
data_search={
'cmd': 10001,
'isDataModle': 'true',
'd': '1558399459075',
'curPage': 1,
'isPage': 'yes',
}
url = "http://142.50.1.60/home/vod.action"
#=====================定义请求头,请求表单数据以及url  End=====================

定义好请求头header、data后

r = requests.post(url,data_search,headers = headers)
vodJson = json.loads(r.text)#得到获取的所有json数据
videoCount = vodJson["page"]["count"]#获取json数据中指定的参数数据
  • selenium模拟点击

目前用的不多,主要是接触到了,我用的Chrome浏览器,首先查看版本号,下载对应的chrome插件,下载的webdriver  文件只要放在python目录下的script下即可

下载插件地址:https://sites.google.com/a/chromium.org/chromedriver/downloads/version-selection 

重启浏览器然后可以尝试一下下面的例子

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
 
browser = webdriver.Chrome()
# 打开谷歌浏览器
try:
    browser.get('http://www.baidu.com')
#     打开百度这个网站
    input = browser.find_element_by_id('kw')
#     找到kw这个元素
    input.send_keys('Python')
#     敲入python
    input.send_keys(Keys.ENTER)
#     敲入回车
    wait = WebDriverWait(browser, 10)
#     等待
    wait.until(EC.presence_of_element_located((By.ID, 'content_left')))
#     等待元素被加载出来
    print(browser.page_source)
finally:
    browser.close()
  • 获取网页中表格操作

需要获取的王爷中可能会包括一些表格数据,table等,如果自己一个一个分析的话会非常的麻烦,下面这个直接将所有的行设置为一个list,直接取单行信息即可

trs = soup.select('.data_table tr')#找到对应table中的tr
del trs[0]#这是为了删除表头
#重要的是这个将表格信息拆分
for tr in trs:
    tds = tr.find_all('td')
    td = [x for x in tds]
  • 将数据写入excel表格中

xlsname = getDate+"时Rew.xlsx"
df=pd.DataFrame({'ASIN':['B076JB67PL','B076J7K4YQ','B076JD16F6','B076J9RBNG','B07QQSJBV7','B07JQJDZYL','B07QMM21KS'],'AllReview':[CountA,CountB,CountC,CountD,CountE,CountF,CountG],'NewDate':[redateA,redateB,redateC,redateD,redateE,redateF,redateG],'Review2017':[CountA2017,CountB2017,CountC2017,CountD2017,CountE2017,CountF2017,CountG2017],'Review2018':[CountA2018,CountB2018,CountC2018,CountD2018,CountE2018,CountF2018,CountG2018],'Review2019':[CountA2019,CountB2019,CountC2019,CountD2019,CountE2019,CountF2019,CountG2019]})

workbook=xlsxwriter.Workbook(xlsname)
worksheet=workbook.add_worksheet()
format_columname=workbook.add_format({'bold':True,'font_color':'black','align' : 'center', 'valign' : 'vcenter', 'bg_color':'yellow'})#设置表格样式
format_row = workbook.add_format({'font_color':'black','align' : 'center', 'valign' : 'vcenter'})
worksheet.set_column("A:A", 15)#设置宽度
worksheet.set_column("B:B", 15)
worksheet.set_column("C:C", 20)
worksheet.set_column("D:D", 15)
worksheet.set_column("E:E", 15)
worksheet.set_column("F:F", 15)
worksheet.write#函数写入第一行列名,参数分别表示行、列、数据、数据格式。
for col in range(len(df.columns)):
    worksheet.write(0,col,df.columns[col],format_columname)
for row in range(7):
    worksheet.write(row+1,0,df.ASIN[row],format_row)     
for row in range(7):
    worksheet.write(row + 1, 1, df.AllReview[row],format_row)      
for row in range(7):
    worksheet.write(row + 1, 2, df.NewDate[row],format_row) 
for row in range(7):
    worksheet.write(row + 1, 3, df.Review2017[row],format_row) 
for row in range(7):
    worksheet.write(row + 1, 4, df.Review2018[row],format_row) 
for row in range(7):
    worksheet.write(row + 1, 5, df.Review2019[row],format_row) 
print("Success!!")
workbook.close()

持续更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值