python按综合、销量排序抓取100页的淘宝商品列表信息
进入淘宝网,分别按综合、销量排序抓取100页的所有商品的列表信息。
1、按综合
importre fromseleniumimportwebdriver fromselenium.common.exceptionsimportTimeoutException fromselenium.webdriver.common.byimportBy fromselenium.webdriver.support.uiimportWebDriverWait fromselenium.webdriver.supportimportexpected_conditionsasEC frompyqueryimportPyQueryaspq#获取整个网页的源代码 fromconfigimport*#可引用congif的所有变量 importpymongo importpymysql #client=pymongo.MongoClient(MONGO_URL) #db=client[MONGO_DB] #按综合排序100页 #打开淘宝链接,输入‘美食',搜索 #自动翻页:先得到总页数,再转到_页,确定 # #browser=webdriver.PhantomJS(service_args=SERVICE_ARGS) #browser=webdriver.Chrome() browser=webdriver.Firefox() wait=WebDriverWait(browser,10) defsearch(): print('正在搜索...') try: browser.get('https://www.taobao.com')#用这个网页'https://s.taobao.com',无法输入keywords input=wait.until( EC.presence_of_element_located((By.CSS_SELECTOR,'#q'))#打开淘宝,右击查看元素,定位到搜索框,选择对应代码,复制-CSS选择器,其实就是‘#q'。 ) submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm>div.search-button>button'))) input.send_keys(KEYWORD)#模拟操作,输入内容 submit.click()#点击提交 total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager>div>div>div>div.total')))#页数 returntotal.text exceptTimeoutException: returnsearch() #翻页 defnext_page(page_number): print('正在翻页',page_number) try: input=wait.until( #输入框 EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager>div>div>div>div.form>input'))#打开淘宝,右击查看元素,定位到搜索框,选择对应代码,复制-CSS选择器,其实就是‘#q'。 ) #搜索按钮 submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#mainsrp-pager>div>div>div>div.form>span.btn.J_Submit')))#未修改 input.clear() input.send_keys(page_number)#模拟操作,输入页码 submit.click() #判断翻页是否成功,找到高亮页码数,由数子判断 wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager>div>div>div>ul>li.item.active>span'),str(page_number))) get_products() exceptTimeoutException: next_page(page_number) #解析,获取每页的商品并输出 defget_products(): wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#mainsrp-itemlist.items.item')))#加载所有宝贝 html=browser.page_source doc=pq(html) items=doc('#mainsrp-itemlist.items.item').items() foriteminitems: product={ #'picture':item.find('.pic.img').attr('src'),#用find去获取内部元素,选择器是pic,img,用attr获取属性 'image':item.find('.pic.img').attr('data-src'),#用find去获取内部元素,选择器是pic,img,用attr获取属性 'shop_id':item.find('.shop').find('a').attr('data-userid'),#店铺id 'data_id':item.find('.shop').find('a').attr('data-nid'),#商品id 'link':item.find('.pic-box-inner').find('.pic').find('a').attr['href'], 'price':item.find('.price').text()[1:-3],#用text获取内容 'deal':item.find('.deal-cnt').text()[:-3], 'title':item.find('.title').text().replace('',''), 'shop':item.find('.shop').text(), 'location':item.find('.location').text() } #print(product) #print(product['location']) save_to_mysql(product) ''''' defmain(): try: #search() total=search()#此时total=‘共100页,' total=int(re.compile('(\d+)').search(total).group(1))#用正则表达式提取数字100 #print(total) foriinrange(2,total+1): next_page(i) exceptException: print('出错啦') finally:#不管有没有异常,都要执行此操作 browser.close()#关浏览器 ''' defmain(): total=search() total=int(re.compile('(\d+)').search(total).group(1)) foriinrange(2,total+1): next_page(i)#显示当前爬取网页的页数 print('搞定%d'%i) defsave_to_mysql(product): #print(product['location']) #,use_unicode=False try: conn=pymysql.connect(host='localhost',user='root',passwd='',db='test1',port=3306,charset='utf8') cur=conn.cursor()#创建一个游标对象 sql="""INSERTINTOwomen_clothes_zongheVALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)""" cur.execute(sql,(product['shop_id'],product['shop'],product['link'],product['data_id'],product['title'],product['price'],product['location'],product['deal'],product['image'])) #cur.execute(sql) print('-----数据保存成功-----') cur.close() conn.commit() conn.close()#关闭数据 exceptpymysql.Errorase: print(e) if__name__=='__main__': #连接数据库 conn=pymysql.connect(host='localhost',user='root',passwd='',db='test1',port=3306,charset="utf8") cur=conn.cursor()#创建一个游标对象 cur.execute("DROPTABLEIFEXISTSwomen_clothes_zonghe")#如果表存在则删除 #创建表sql语句 sqlc="""CREATETABLEwomen_clothes_zonghe( shop_idVARCHAR(500), shopVARCHAR(500), linkVARCHAR(1000), data_idvarchar(100), titleVARCHAR(1000), priceVARCHAR(500), locationVARCHAR(500), dealVARCHAR(500), imageVARCHAR(1000) )""" cur.execute(sqlc)#执行创建数据表操作 main()
2、按销量
importre frombs4importBeautifulSoup frompyqueryimportPyQueryaspq#获取整个网页的源代码 fromconfigimport*#可引用congif的所有变量 importpymongo importpymysql importurllib importrequests importjson importbs4 fromseleniumimportwebdriver frompyqueryimportPyQueryaspq#获取整个网页的源代码 #完整爬取所有页面的商品信息共100页按销量排序 browser=webdriver.Firefox() wait=WebDriverWait(browser,10) defget_url(keyword): url_str=urllib.parse.quote(keyword) i=0 forjinrange(100): yield{ 'url':('https://s.taobao.com/search?q={}&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=' 'a21bo.50862.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170808&sort=sale-desc&bcoffset=0&p4ppushleft=%2C44&s={}').format(url_str,i) } i+=44 #可行 defget_products(url): browser.get(url) wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#mainsrp-itemlist.items.item')))#加载所有宝贝 html=browser.page_source doc=pq(html) #print(doc) items=doc('#mainsrp-itemlist.items.item').items() foriteminitems: product={ #获取image时,用'src'总有部分图片获取不到,因为淘宝设有'data-src'和'src',不同商品这两个属性的前后顺序不一样,直接用'data-src'可避免返回None 'image':item.find('.pic.img').attr('data-src'),#用find去获取内部元素,选择器是pic,img,用attr获取属性 #'image':item.find('.pic-box-inner').find('.pic').find('img').attr['src'], 'price':item.find('.price').text()[1:-3],#用text获取内容 'shop_id':item.find('.shop').find('a').attr('data-userid'),#店铺id 'data_id':item.find('.shop').find('a').attr('data-nid'),#商品id 'link':item.find('.pic-box-inner').find('.pic').find('a').attr['href'], 'deal':item.find('.deal-cnt').text()[:-3], 'title':item.find('.title').text(), 'shop':item.find('.shop').text(), 'location':item.find('.location').text().replace('','') } #print(product) save_to_mysql(product) defsave_to_mysql(product): try: conn=pymysql.connect(host='localhost',user='root',passwd='',port=3306,db='test1',charset='utf8') cur=conn.cursor() sql="insertintowomen_clothes_sales2values(%s,%s,%s,%s,%s,%s,%s,%s,%s)" cur.execute(sql,(product['shop_id'],product['shop'],product['link'],product['data_id'],product['title'],product['price'],product['location'],product['deal'],product['image'])) print('---数据保存成功---') cur.close() conn.commit() conn.close() exceptpymysql.Errorase: print(e) defmain(): keyword='女装' links=get_url(keyword)#字典 #获取每页的url forlinkinlinks: #print(link) url=link['url'] #解析页面 #soup=get_html(url) #print(soup) #get_detail(soup,url) get_products(url) if__name__=='__main__': conn=pymysql.connect(host='localhost',user='root',passwd='',db='test1',port=3306,charset='utf8') cur=conn.cursor() cur.execute('Droptableifexistswomen_clothes_sales2') sqlc="createtablewomen_clothes_sales2(shop_idvarchar(100),shopvarchar(500),linkvarchar(1000),data_idvarchar(100),titlevarchar(500),pricevarchar(200),locationvarchar(100),dealvarchar(100),imagevarchar(1000))" cur.execute(sqlc) cur.close() conn.commit() conn.close() main()
更多内容请参考专题《python爬取功能汇总》进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。