太久没有写爬虫了,掌握的知识不能让他生疏了
想了想写一个按照输入,能查询到豆瓣里的信息
首先,先打开豆瓣的搜索页面
会发现是这样的,左边有一栏标签,然后有个搜索框。
可以点击标签,观察url的变化,发现https://www.douban.com/search?cat=1001&q=中的cat也相对应的发生变化,我这边就先选取几个来,电影,书籍,音乐,游戏。发现除了游戏外,规律是1001,1002,1003.很有意思,然后q=后面的参数就是你要搜索的东西。
那我们要完成的功能,就是在我们自己地方,输入信息,然后输出豆瓣评分等一系列详情。
我这边是在跳转到他的详细页面去爬取数据,当然,如果仅是我最后的那些内容来看,在这个页面就能满足了。
而且我的代码是获得搜索到的第一条数据,如果有更多的需求的话,可以去看一些xpath,然后修改
话不多说,我先获取到修改一条需要修改的url,先写个视图,
def menu(): print("*请输入对应序号,锁定查询范围*") print("********** 1 书籍 **********") print("********** 2 电影 **********") print("********** 3 音乐 **********") print("********** 4 游戏 **********")
这个菜单,表示搜索的标签时什么,然后需要处理下,获取对应url,
def getUrl(x,what): if x == 4: y = 3114 else: y = 1000+x url = 'https://www.douban.com/search?cat={}&q='.format(y)+what getNewUrl(x,url)
那个what指的就是输入的要搜索的内容。
第一条url就这样只做好了,字符串拼一下
然后要获取第二条url,这里用xpath的方法,并输出他
def getNewUrl(x,url): #模拟浏览器 kv = {'user-agent':'Mozilla/5.0'} html = requests.get(url , headers = kv).text s = etree.HTML(html) new_url = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[3]/div[2]/div[1]/div[2]/div/h3/a/@href')[0] print("豆瓣地址:",new_url) spyder(x,new_url)
然后获取到了一条详细页面的url,这时候我们就要去里面找数据了
由于豆瓣的原因,导致这些分区的标题,评分等对应的xpath并不相同,所以我一直在传一个参数x,表示选择的分区,然后再爬虫的函数里分类选择。
def spyder(x,url): #模拟浏览器 kv = {'user-agent':'Mozilla/5.0'} html = requests.get(url , headers = kv).text s = etree.HTML(html) if x == 1: #书籍 title = s.xpath('/html/body/div[3]/h1/span/text()')[0].strip() print("标题:",title) goal = s.xpath('/html/body/div[3]/div[2]/div/div[1]/div[1]/div[1]/div[2]/div/div[2]/strong/text()')[0].strip() print("评分:",goal) chubanshe = s.xpath('//*[@id="info"]/text()') chubanshe1 = s.xpath('//*[@id="info"]/span/text()') #print(chubanshe,chubanshe1) message = [q.strip() for q in chubanshe if q.strip()!=''] message1 = [q.strip() for q in chubanshe1 if q.strip()!='' and q.strip!=':'] isbn = message[len(message)-1] message[len(message)-1] = s.xpath('/html/body/div[3]/div[2]/div/div[1]/div[1]/div[1]/div[1]/div[2]/a/text()')[0].strip() message.append(isbn) text = s.xpath('/html/body/div[3]/div[2]/div/div[1]/div[3]/div[1]/div[1]/div/p/text()')[0].strip() j=0 for i in range(len(message)): if message1[j]==":": j = j+1 print(message1[j],message[i]) j = j+1 print('内容简介:',text) print("********************************************************************") print() print() elif x == 2: #电影 title = s.xpath('/html/body/div[3]/div[1]/h1/span[1]/text()')[0].strip() print("title:",title) goal = s.xpath('/html/body/div[3]/div[1]/div[3]/div[1]/div[1]/div[1]/div[2]/div[1]/div[2]/strong/text()')[0].strip() print("评分",goal) text = s.xpath('/html/body/div[3]/div[1]/div[3]/div[1]/div[3]/div/span[1]/text()')[0].strip() print("剧情简介:",text) elif x == 3: #音乐 title = s.xpath('/html/body/div[3]/h1/span/text()')[0].strip() print("title:",title) goal = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[1]/div[1]/div[2]/div/div[2]/strong/text()')[0].strip() print("评分",goal) text = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[3]/div[1]/span/text()')[0].strip() print("简介:",text) chubanshe = s.xpath('//*[@id="info"]/text()') chubanshe1 = s.xpath('//*[@id="info"]/span/text()') message = [q.strip() for q in chubanshe if q.strip()!=''] message1 = [q.strip() for q in chubanshe1 if q.strip()!='' and q.strip!=':'] j=0 for i in range(len(message)): if message1[j]==":": j = j+1 print(message1[j],message[i]) j = j+1 elif x == 4: #游戏 title = s.xpath('/html/body/div[3]/div[1]/h1/text()')[0].strip() print("title:",title) goal = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[1]/div[2]/div/div/div[2]/strong/text()')[0].strip() print("评分",goal) text = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/p/text()')[0].strip() print("剧情简介:",text)
同时,也是因为豆瓣的原因,导致一些一个区的,但是一些细节数据上的xpath也不尽相同,诶。导致很多数据有些能取到,有些取不到。
最后写一个main
if 'main': while 1: menu() try: print("要查询的编号") x = int(input()) print("请输入要查询的内容") what = input() getUrl(x,what) except: print("请输入数字")
就over啦