太久没有写爬虫了,掌握的知识不能让他生疏了
想了想写一个按照输入,能查询到豆瓣里的信息
首先,先打开豆瓣的搜索页面

会发现是这样的,左边有一栏标签,然后有个搜索框。
可以点击标签,观察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啦